我正在尝试在Java上实现Kafka使用者。
假设使用者包含一些可能引发异常的消息处理逻辑。在这种情况下,消费者应该睡一段时间并重新处理最后一条消息。
我的想法是使用手动偏移管理:在失败时未提交偏移量,因此消费者可能会从旧偏移量中读取。
在测试期间,我发现尽管没有提交偏移,但实际上只读取了一次消息。仅在应用程序重新启动时才考虑上次提交的偏移量。
我的问题是:
答案 0 :(得分:1)
KafkaConsumer
保留最新的偏移量内存中,因此,如果发生异常(并从中恢复)并且您想再次阅读消息,则需要在第二次轮询之前使用seek()
。
提交偏移量仅“存在”,以便在客户端关闭或崩溃时保留偏移量(即,可靠地与内存中存储的偏移量)。在客户端启动时,会获取最新提交的偏移量,而客户端仅使用它自己的内存中偏移量。
如果您想要将偏移提交与其他一些操作“捆绑”,则手动偏移管理很有用(例如,另一个必须与提交的Kafka偏移同步的系统中的第二个“提交”)。