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

2024-04-25 14:37:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有来自不同应用程序的多个生产者向RabbitMQ中的主题发送消息。以及来自不同应用程序的多个消费者阅读这些主题。这个简单的体系结构作为一个PoC已经完美地工作了。 但现在我有多个来自这些应用程序的实例,我不希望appx实例1读取与appx实例2相同的消息。然而,appx和appy(及其所有实例)需要从同一主题中红色。在

我知道如果使用者共享相同的消费者ID,Karaf会平衡来自主题的消息的消耗?我一直在看医生,没有发现像这样的东西。在


Tags: 实例id应用程序消息主题体系结构rabbitmq使用者
1条回答
网友
1楼 · 发布于 2024-04-25 14:37:41

我相信你需要卡夫卡的消费群体功能。在

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

请参见rabbitmq getstarted,您可以结合Topics模式和Work queues模式来实现此功能。在

示例代码

接收.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()

发送.py

^{pr2}$

如何运行它?

您需要启动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)的交叉映射

那么,开始吧发送.py公司名称:

python send.py

您将看到每个应用程序的一个实例可以获取消息。 如果您再次发送,来自两个不同应用程序的另一个实例可以接收消息。在

相关问题 更多 >