rabbitmq - Kombu 可以发布和订阅多个消费者吗

标签 rabbitmq amqp kombu

使用 Kombu 和 RabbitMQ 来实现经典的发布/订阅设计模式。我创建了一个创建主题的生产者:

from kombu import Connection, Exchange, Queue

media_exchange = Exchange('media', 'topic', durable=False)
video_queue = Queue('video', exchange=media_exchange, routing_key='video')

with Connection('amqp://guest:guest@localhost//') as conn:
    producer = conn.Producer(serializer='json')
    producer.publish('Hello World!',
                      exchange=media_exchange, routing_key='video',
                      declare=[video_queue])

然后我创建了一个消费者来从发布者那里消费:
from kombu import Connection, Exchange, Queue

media_exchange = Exchange('media', type='topic', durable=False)
video_queue = Queue('video', exchange=media_exchange, routing_key='video')

def process_media(body, message):
    print(body)
    #message.ack()

with Connection('amqp://guest:guest@localhost//') as conn:
    with conn.Consumer(video_queue, callbacks=[process_media]) as consumer:
        # Process messages and handle events on all channels
        while True:
            conn.drain_events()

然后启动两个消费者,每个消费者都在一个单独的终端中;都等待消息:
terminal 1: python consumer.py
terminal 2: python consumer.py

当我运行生产者时,只有一个消费者收到消息。

最佳答案

生产者在交换中发布,而不是在队列中。队列由消费者定义。当为每个消费者使用不同的队列名称时,所有人都会收到消息。
当对同一个队列使用多个消费者时,它就是负载平衡,这就是为什么只有一个消费者收到消息。

关于rabbitmq - Kombu 可以发布和订阅多个消费者吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24919316/

相关文章:

python - 使用Kombu ConsumerMixin,如何声明多个绑定(bind)?

django - django-celery (djcelery) 表有什么用?

java - 尽管设置了心跳,RabbitMQ 连接仍掉线且无法恢复

erlang - Centos 5.5 上的 RabbitMQ 安装问题

php - RabbitMQ - 两个 EC2 实例之间的间歇性 etimedout 错误

queue - RabbitMQ使用者崩溃时,提取的消息会如何处理?

python - 区分celery、kombu、PyAMQP和RabbitMQ/ironMQ

c# - RabbitMQ:erl.exe 占用高 CPU 使用率

java - 在 Spring AMQP 中处理无法传递给消费者的消息

java - RabbitMQ 工作队列 : Starting Consumer after Sender [Java]