Задать вопрос
@milltt

Как запустить aiogram webhook и aio-pika в одном event loop?

Есть вот такой consumer из оф. документации aio-pika:
async def orders_queue(): 
     connection = await aio_pika.connect_robust( 
         host="localhost" 
     ) 
  
     queue_name = "orders" 
     async with connection: 
         channel = await connection.channel() 
  
         await channel.set_qos(prefetch_count=10) 
         queue = await channel.declare_queue(queue_name) 
  
         async with queue.iterator() as queue_iter: 
             async for message in queue_iter: 
                 async with message.process(): 
                     order_id = message.body.decode() 
                     print(order_id) 
  
                     if queue.name in message.body.decode(): 
                         break

На стороне крутится FastApi сервис, который принимает callback от эквайринга и обновляет статус заказа в бд. Необходимо реализовать создание заказа на стороне другого агрегатора непосредственно в боте, так как при проектировании библиотеки, модели и схемы данных не разнесли по отдельным сервисам, а переносить это все в сервис для работы с эквайрингом не целесообразно. Я решил, что можно с этого сервиса публиковать сообщение в очередь и обрабатывать его на стороне бота, но если запускать бота с помощью вебхука, а эту функцию-consumer с помощью create_task, то айограммовский вебхук блокирует ее дальнейшее выполнение, бот работает, но сообщения из очереди кролика больше не принимает. Есть ли вариант обхода блокировки loop'а стартером вебхука, чтобы и бот продолжал принимать апдейты и consumer не блокировался?
  • Вопрос задан
  • 779 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
@milltt Автор вопроса
Запускать с помощью asyncio.create_task в теле функции on_startup

async def on_startup(dp):
    await bot.set_webhook(config.tg_bot.webhook_url)

    asyncio.create_task(orders_queue())
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы