私のプロジェクトでは、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