8

私のプロジェクトでは、REST API (FastAPI で構築され、Hypercorn で実行) を開始しようとしています。さらに、起動時に RabbitMQ コンシューマー (aio_pika を使用) も開始したいと考えています。

Aio Pika は、障害時に自動的に再接続する堅牢な接続を提供します。コンシューマーで以下のコードを実行するhypercorn app:appと、残りのインターフェイスは正しく起動しますが、aio_pika からの再接続は機能しなくなります。2 つの異なるプロセス (またはスレッド?) で本番環境の安定した RabbitMQ コンシューマーと RestAPI をアーカイブするにはどうすればよいですか? 私のpythonバージョンは3.7です。私のアプローチがPythonの方法ではない場合に備えて、私は実際にはJavaとGoの開発者であることに注意してください:-)

@app.on_event("startup")
def startup():
   loop = asyncio.new_event_loop()
    asyncio.ensure_future(main(loop))


@app.get("/")
def read_root():
   return {"Hello": "World"}


async def main(loop):
connection = await aio_pika.connect_robust(
    "amqp://guest:guest@127.0.0.1/", loop=loop
)

async with connection:
    queue_name = "test_queue"

    # Creating channel
    channel = await connection.channel()  # type: aio_pika.Channel

    # Declaring queue
    queue = await channel.declare_queue(
        queue_name,
        auto_delete=True
    )  # type: aio_pika.Queue

    async with queue.iterator() as queue_iter:
        # Cancel consuming after __aexit__
        async for message in queue_iter:
            async with message.process():
                print(message.body)

                if queue.name in message.body.decode():
                    break
4

1 に答える 1