Kafka在Python中指示group_id时未收到消息

时间:2018-09-21 00:48:53

标签: python apache-kafka kafka-consumer-api consumer kafka-python

我正在使用Kafka(kafka-python)3.0.0-1.3.0.0.p0.40版本。我需要为Python中的主题“模拟”配置使用者。当我不指明group_id时,即group_id = None,它会收到很好的消息。但是,如果我指示group_id,则它不会收到任何消息。

这是我在Python中的代码:

consumer = KafkaConsumer(bootstrap_servers='XXX.XXX.XXX.XXX:9092',
                         group_id = 'myTestGroupID', enable_auto_commit = True)
consumer.subscribe(['simulation'])
# not using assign method here as auto_commit is enabled
# partitions = [TopicPartition('simulation',num) for num in range(0,9)]
# consumer.assign([TopicPartition('simulation', partitions[0])])

while not self.stop_event.is_set():
    for message in consumer:
        print(message)

我试图在使用者属性文件中搜索group_id的一些默认值,但我发现了一个cloudera_mirrormaker,但是没有任何改变。 我将需要使用多个使用者,因此,有一个group_id并且他们共享相同的group_id非常重要。 在许多资料中,我发现group_id可以是任何字符串...

当我在控制台中运行此主题的使用者时,它会工作并接收消息

./kafka-console-consumer.sh --bootstrap-server XXX.XXX.XXX.XXX:9092 --topic simulation --from-beginning --consumer-property group.id=myTestGroupID  --partition 0

当我运行kafka-consumer-groups.sh列出所有可用组时,它为空。

如果有人知道为什么将其卡在Python中,将不胜感激。 非常感谢

这里是生产者的代码(为简化起见,我将其简化了,因为在这种情况下它不会改变问题)

from kafka import KafkaProducer
class Producer(threading.Thread):
    ...
    def run(self):
        producer = KafkaProducer(bootstrap_servers='XXX.XXX.XXX.XXX:9092')
        while not self.stop_event.is_set():
            string = 'test %s' %time.time()
            producer.send('simulation', string.encode())
            time.sleep(0.5)
        producer.close()

2 个答案:

答案 0 :(得分:0)

  

问题:Kafka在显示group_id时未收到消息


  

请尝试在实例化的KafkaConsumer上传递“主题”,就像在Documentation中那样:

# join a consumer group for dynamic partition assignment and offset commits
from kafka import KafkaConsumer
consumer = KafkaConsumer('simulation', group_id='myTestGroupID')
for msg in consumer:
    print (msg)
     

Documentation: KafkaConsumer对于group-id的类型很清楚:

     

group_id (str或无)–要加入以进行动态分区分配(如果启用)并用于获取和提交偏移量的使用者组的名称。如果为None,则禁用自动分区分配(通过组协调器)和偏移量提交。默认值:无

答案 1 :(得分:0)

我遇到了同样的问题,在处理高延迟环境和大消息(> 1Mb)时,部分接收不到消息(大部分消息丢失)。

我并没有付出太多努力来寻找根本原因,但我猜想是在消息处理完成之前启动了消费者重新平衡,这似乎在没有其他消费者可用时会引起问题(在我的情况下,有一个或两个遇到相同问题的消费者。

对我来说,诀窍是增加 max_poll_interval_ms 并设置 max_poll_records = 1

consumer = KafkaConsumer(bootstrap_servers='XXX.XXX.XXX.XXX:9092',
                     group_id = 'myTestGroupID', 
                     enable_auto_commit = True,
                     max_poll_interval_ms=5000,
                     max_poll_records=1)

您可以在以下位置找到更多信息: https://kafka.apache.org/23/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html检测消费者失败部分。