重新启动Kafka python MultiProcessConsumer再次使用队列中的所有消息

时间:2015-01-05 14:17:52

标签: offset apache-kafka

参考:Restarting a Kafka (python) consumer consumes all the messages in the queue again

我是kafka的新手,我也在尝试处理抵消管理。

使用最新版本的Apache-Kafka(0.8.1.1。)和plapi安装的kafka-python 0.9.2(2014-08-27上次上传),这与github上的当前主分支不同。

使用" SimpleConsumer"进行测试=>崩溃并重新启动脚本会消耗上一个已知偏移量的消息。

使用" MultiProcessConsumer"进行测试=>崩溃并重新启动脚本将从offset" 0"

重新开始消耗

我的小脚本(MultiProcessConsumer):

from kafka import KafkaClient, MultiProcessConsumer
KFK = KafkaClient("localhost:9092")
consumer = MultiProcessConsumer(KFK, "my-group1", "my-topic", num_procs=2)

我可以通过以下方式查看抵消:

consumer.offsets
{0: 0, 1: 0}

然后,我跑:

A = consumer.get_messages(count=1235)
consumer.offsets
{0: 1235, 1: 0}

再次崩溃并重新启动脚本后,首先调用" consumer.offsets"返回" {0:1235,1:0}"这很好。但是跑步:

A.consumer.get_messages(count=388)
consumer.offsets
{0: 388, 1: 0}

有关如何处理此问题的任何想法?此外,无论如何都要正确地改变MultiProcessConsumer偏移从定义的位置开始?

感谢您的帮助。

修改: 潜入kafka-python lib源并检查GitHub上的问题后, 见:https://github.com/mumrah/kafka-python/issues/173

所以问题是当主多进程消费者开始进行子进程时,它会将其偏移量转移到" 0"在主题的每个分区上(因为子进程的autocommit设置为false)而不是给它们正确的值。

参见" mahall"评论GitHub。

1 个答案:

答案 0 :(得分:0)

这取决于消费者请求kafka经纪人抵消的方式。很可能你在Java中做了与此相同的事情

readOffset = getLastOffset(consumer,topic, partition, kafka.api.OffsetRequest.EarliestTime(), clientName);

尝试这样的事情

readOffset = getLastOffset(consumer,topic, partition, kafka.api.OffsetRequest.LatestTime(), clientName);