两名卡夫卡消费者互相造成奇怪的行为

时间:2017-04-07 13:53:40

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

我有两个不同的客户ID和组ID的消费者。除了保留时间和最大分区,我的Kafka安装包含默认配置。我环顾四周看看是否有其他人有同样的问题,但无法取得任何结果。

所以场景是这样的:

消费者A: 连接到Kafka,消耗大约需要消费的300万条消息,然后闲置等待更多消息。

消费者B: 不同的客户端/组ID连接到相同的Kafka主题,这导致消费者A重复300万条消息,而消费者B也消费它们。

这两个消费者是两个完全不同的Java应用程序,它们在同一台计算机上运行不同的客户端和组ID。 Kafka服务器在另一台计算机上。

这是卡夫卡的正常行为吗?我完全失去了。

这是我的消费者配置:

bootstrap.servers=192.168.110.109:9092
acks=all
max.block.ms=2000
retries=0
batch.size=16384
auto.commit.interval.ms=1000
linger.ms=0
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
block.on.buffer.full=true
enable.auto.commit=false
auto.offset.reset=none
session.timeout.ms=30000
zookeeper.session.timeout=100000
rebalance.backoff.ms=8000

group.id=consumerGroupA
zookeeper.connect=192.168.110.109:2181
poll.interval=100

我的消费者B的明显区别是group.id=consumerGroupB

1 个答案:

答案 0 :(得分:2)

这是正确的行为。因为根据您的配置,您的消费者不会提交已阅读的记录的偏移量!

当消费者读取记录时,它必须提交读取记录,您可以通过设置enable.auto.commit=true或手动提交每个记录来确保消费者自动提交偏移量。在这种情况下,我认为自动提交对你没问题。