RabbitMQ - 从同一主题中读取的多个实例

时间:2018-02-23 21:11:00

标签: python rabbitmq

我有来自不同应用程序的多个生产者向RabbitMQ中的主题发送消息。来自不同应用的多个消费者阅读这些主题。这种简单的架构一直作为PoC完美运行。 但是现在我有来自这些应用程序的多个实例,我不希望应用程序X实例1读取与应用程序X实例2相同的消息。但是,应用程序X和应用程序Y(包含其所有实例)需要从同一主题中获取红色。

我知道如果消费者共享相同的消费者ID,Karaf会平衡主题消息的消费。 RabbitMQ中是否存在此功能?我一直在阅读文档,但我没有发现这样的内容。

1 个答案:

答案 0 :(得分:2)

我相信你需要kafka的消费者群体功能。

(对于每条消息,不同的消费者群体应该一起消费它,但每个消费者群体中只有一个消费者可以消费此消息)

请参阅rabbitmq getstarted,您可以合并Topics模式& Work queues模式可以实现此功能。

示例代码

<强> receive.py

#!/usr/bin/env python

import pika
import sys

connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='topic_logs',
                         type='topic')

queue_name = sys.argv[1]
channel.queue_declare(queue=queue_name)

channel.queue_bind(exchange='topic_logs',
                   queue=queue_name,
                   routing_key='my_key')

print ' [*] Waiting for logs. To exit press CTRL+C'

def callback(ch, method, properties, body):
    print " [x] %r:%r" % (method.routing_key, body,)
    ch.basic_ack(delivery_tag = method.delivery_tag)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback,
                      queue=queue_name)

channel.start_consuming()

<强> send.py

#!/usr/bin/env python

import pika
import sys

connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='topic_logs',
                         type='topic')

routing_key = 'my_key'
message = 'Hello World!'
channel.basic_publish(exchange='topic_logs',
                      routing_key=routing_key,
                      body=message)
print " [x] Sent %r:%r" % (routing_key, message)
connection.close()

如何运行?

您需要启动4位消费者来解释这个问题:

python receive.py consumer_group1
python receive.py consumer_group1
python receive.py consumer_group2
python receive.py consumer_group2

以上交叉指向app1(instance1),app1(instance2),app2(instance1),app2(instance2)

然后,启动send.py:

python send.py

您将看到每个应用只能获得该消息的一个实例。 如果您再次发送,则来自两个不同应用的另一个实例可以收到该消息。