以下消费者代码:
from kafka.client import KafkaClient
from kafka.consumer import SimpleConsumer
kafka = KafkaClient("localhost", 9092)
consumer = SimpleConsumer(kafka, "my-group", "my-topic")
consumer.seek(0, 2)
for message in consumer:
print message
kafka.close()
然后我用脚本生成消息:
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-topic
问题在于,当我将消费者作为两个不同的流程启动时,我会在每个流程中收到新消息。但是我希望它只发送给一个消费者,而不是广播。
在Kafka(https://kafka.apache.org/documentation.html)的文档中写道:
如果所有消费者实例都具有相同的消费者群体,那么这个 就像传统的队列平衡对消费者的负担一样。
我发现这些消费者的群体是相同的 - my-group 。
如何使新消息被一个消费者读取而不是广播呢?
答案 0 :(得分:2)
答案 1 :(得分:1)
很难从上面的例子中看出你的Zookeeper配置是什么,或者根本没有。您需要一个Zookeeper集群来保存消费者组信息WRT每个组中的消费者已经消耗给给定的偏移量。
这里有一个很好的例子: Official Kafka documentation - Consumer Group Example
答案 2 :(得分:1)
这不应该发生 - 确保两个使用者都在zookeeper znodes中的同一个使用者组下注册。消费者组应该只消耗一个主题的每条消息,因此组中每个人中的一个消费者应该收到消息,而不是您正在经历的消息。您使用的是什么版本的Kafka?