aioamqpで1つのチャネルを使用して複数のキューを同時に消費できますか?aioamqpで一度に複数のキューを消費する
免責事項:私はプロジェクトの問題追跡ツールにissueを作成しましたが、私がやっていることがまったく理にかなっているかどうかは本当に不思議です。
aioamqpで1つのチャネルを使用して複数のキューを同時に消費できますか?aioamqpで一度に複数のキューを消費する
免責事項:私はプロジェクトの問題追跡ツールにissueを作成しましたが、私がやっていることがまったく理にかなっているかどうかは本当に不思議です。
この機能は、AMQPプロトコルでは使用できません(私のプロトコルの理解が正しいと仮定して)。
キューから消費する場合は、チャネルでbasic.consume
コールを発行する必要があります。この呼び出しに必要な引数はqueue_name
です。これは、応答がキューからのオブジェクトである "ブロッキング"(接続をブロックしていないがチャネルをブロックしていない)呼び出しです。
短い説明:各コンシューマは、キューオブジェクトを待機している間にチャネルに排他的にアクセスする必要があります。
私の最初の考えは間違っていたので、 AMQPを掘り下げたところ、実際には1つのチャネルで複数のコンシューマーをサポートしていることが分かりました。ただし、必要に応じてサーバーが制限を設定できるようにします。残念ながら、私はRabbitMQの特定の事件についての情報を見つけることができませんでした。だから私はそのような制限がないと仮定します。全体的に、これは図書館の問題です。
ただし、回避策はまだ有効です。消費者ごとにチャネルを作成するだけです。それはうまくいくはずです。
作品 ammooで:
import asyncio
from ammoo import connect
async def consume(channel, queue_name):
async with channel.consume(queue_name, no_ack=True) as consumer:
async for message in consumer:
print('Message from {}: {}'.format(queue_name, message.body))
if message.body == b'quit':
print('Consumer for queue {} quitting'.format(queue_name))
break
async def main():
async with await connect('amqp://localhost/') as connection:
async with connection.channel() as channel:
await channel.declare_queue('queue_a')
await channel.declare_queue('queue_b')
await asyncio.gather(
consume(channel, 'queue_a'),
consume(channel, 'queue_b')
)
print('Both consumers are done')
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
出力:
# python3 test.py
Message from queue_a: b'hello queue a'
Message from queue_b: b'hello queue b'
Message from queue_a: b'quit'
Consumer for queue queue_a quitting
Message from queue_b: b'another message for queue b'
Message from queue_b: b'quit'
Consumer for queue queue_b quitting
Both consumers are done
免責事項:私は右のライブラリ
You'rの作者だけど、私はただで複数のチャネルを開きます。それは安い操作だからです。ありがとう!! –
RabbitMQは、同じチャネルから複数のキューを消費することをサポートしています。彼らはすべて同じコールバックに配信されます。 – eandersson
@eanderssonええ、私はAMQP仕様を掘り下げました。それはあなたが正しいと思われます。答えを更新しました。 – freakish