我正在尝试用Java实现一个简单的Producer - > Kafka - > Consumer应用程序。我能够成功地生成和消费消息,但是当我重新启动消费者时会出现问题,其中一些已经消费的消息再次被消费者从Kafka中获取(不是所有消息,而是最后一些消息)消费消息)。
我在我的消费者中设置了autooffset.reset=largest
,我的autocommit.interval.ms
属性设置为1000毫秒。
这些'已经消耗过的消息已经被重新传递'是一个已知问题,还是我在这里缺少任何其他设置?
基本上,有没有办法确保消费者没有获取/消费以前消费的消息?
答案 0 :(得分:3)
Kafka使用Zookeeper来存储消费者抵消。由于Zookeeper操作非常慢,因此不建议在消耗每条消息后提交偏移量。
可以向使用者添加关闭挂钩,以便在退出之前手动提交主题偏移量。但是,这在某些情况下(例如jvm crash或kill -9
)无济于事。为了防止这种情况,我建议实现自定义提交逻辑,它将在处理每个消息(文件或本地数据库)后在本地提交偏移量,并且还每1000ms向Zookeeper提交一次偏移量。在消费者启动时,应该查询这两个位置,并且最多应使用两个值作为消耗偏移。