Kafka客户端poll()在每个收到的消息后引发EOFError

时间:2019-03-06 13:58:18

标签: apache-kafka kafka-consumer-api

我使用的是Confluent github中发现的示例客户端轮询代码的细微变化:

c = Consumer({'bootstrap.servers':'localhost:9092','group.id':'devops','auto.offset.reset':'earliest'})
c.subscribe(['system-diskio-write-bytes','system-cpu-user-pct'])

try:
    while True:
        msg = c.poll(timeout=1000.0)
        if msg is None:
            continue
        if msg.error():
            print(msg.error())
        else:
            print('topic: %s key: %s value: %s' % (msg.topic(), msg.key(), msg.value()))

except KeyboardInterrupt:
    print('Polling interrupted by consumer')

每收到一条消息,就会引发EOF KafkaError:

topic: system-diskio-write-bytes key: None value: b'{"route" : "system-diskio-write-bytes", "timestamp" : 2019-03-06T13:46:25.244, "value" : 655002980352.0}'
KafkaError{code=_PARTITION_EOF,val=-191,str="Broker: No more messages"}

我不明白为什么会这样-关于为什么抛出此错误的任何想法如何解决?任何想法都非常感谢-谢谢!

1 个答案:

答案 0 :(得分:0)

好的,答案很详细here。解释如下:

  

每次使用者达到一个新的结束偏移量时,无论您的应用程序在10秒钟内没有调用poll(),都会在内部消息队列(由poll()服务)上推送EOF事件。

可以如下禁用EOF事件:

enable.partition.eof=false