作者回复: 嗯, 严格来说。提交频率指的是最小的提交间隔。比如设置5s,Kafka保证至少等待5s才会自动提交一次。
作者回复: 只要consumer没有重启,不会发生重复消费。因为在运行过程中consumer会记录已获取的消息位移
作者回复: 如果调用没有参数的commit,那么提交的是500
作者回复: 有可能的~
作者回复: hmmm... 其实我一直觉得提交间隔这个参数的命名有些问题。它实际保证的是位移至少要隔一段时间才会提交,如果你是单线程处理消息,那么只有处理完消息后才会提交位移,可能远比你设置的间隔长。
作者回复: 嗯嗯,我的意思是consumer提交的位移值虽然就是消息在分区中的位移值,但这个提交位移的概念和分区中的位移概念是不同的。
作者回复: 5000条消息。
作者回复: 抱歉,不太清楚spring-kafka的实现细节。。。
作者回复: 不确定百分之百地理解了您的问题。通常来说,当调用KafkaConsumer.close方法时consumer会关闭。
作者回复: 偶发的提交失败也不一定就意味着重复消费,看consumer程序的运行情况。
作者回复: 如果不重启的话,程序里面是否显式调用了seek重新调整了offset呢?如果没有就无法重新消费那些已经消费的消息
作者回复: 如果是批任务,能否等到数据抽取完了再进行消费。如果是streaming任务,这是经典的table-table join,最好使用特定的流处理框架来处理
作者回复: 如果没有达到提交时间就不会提交,自动提交完全由consumer自行维护,确实可能造成数据的重复消费。你的理解完全没有问题:)
目前单纯依赖consumer是无法避免消息的重复消费的,Kafka默认提供的消息处理语义就是至少一次处理。