Kafka消息可用性

时间:2018-05-04 13:44:06

标签: apache-kafka

我有一个应用程序,它使用幂等生成器将唯一可识别和可订购的消息写入主题。当应用程序崩溃并重新启动时,它会检查每个分区的最后一条消息,以确定它写入的最后一条成功消息,然后开始发送下一条消息。

为了测试这种方法的确切一次写入语义,我将整个设置容器化,并且随机间隔,我杀死了一个kafka代理容器。在不同的随机间隔,我杀了我的应用程序。因此,经纪人和我的申请的杀戮可能会不时发生在同一时间。

杀戮之后,我很快重新启动它们,我注意到在某些相对罕见的场合中,会有两次写入消息。我已经将问题确定为 consumer.endOffsets()有时不返回分区的最后一个偏移量而是返回之前的偏移量。我怀疑这可能是因为不知何故在应用程序崩溃之前发送的最后一条消息仍然在传输中。我也注意到延迟我的应用程序的重启解决了这个问题,但这似乎是一种非确定性的方法。我不知道在重新启动之前要等多久...

我想准确了解传输的位置和方式,以及如何让我的应用程序等待此消息保证可以通过在我的应用程序中睡眠一段时间与某些kafka相对应配置选项,或某种方式告诉我的消费者等待传输中的所有邮件完全处理和可用。

作为参考,我将idempotence设置为true,insync replicas设置为2,我的主题的复制因子为3。我没有手动指定重试也没有确认,因此它们会自动设置为无限和全部。我的代码中没有手动重试。

非常感谢任何帮助。我不确切知道我可以提供哪些细节以帮助,但如果您需要,我们会毫不犹豫地询问。

0 个答案:

没有答案