我使用spring框架和具有3个代理群集的kafka。我发现使用者没有消耗某些消息(假设所有已发送消息之间的消息间隔为0.01%),因此在生产者代码中,我记录了api返回的消息偏移量:
ListenableFuture<SendResult<String, Message>> future = messageTemplate.sendDefault(id, message);
SendResult<String, Message> sendResult = future.get();
String offset = sendResult.getRecordMetadata().offset();
我使用返回偏移量来查询所有分区中的kafka主题,但找不到消息(我测试了与消费者使用的消息相关的其他偏移量,并且它们位于kafka中),这是什么问题,如何确保该消息已发送到卡夫卡?
我还在制作人中使用了messageTemplate.flush();
答案 0 :(得分:1)
我发现,当Kafka经纪人的主题负责人出现故障时,Kafka将重新平衡自身,而另一个经纪人成为该分区的负责人,并且如果ack
配置未设置为all
,则有机会在此过程中丢失一些数据。因此将配置更改为
ack=all
此外,如果同步副本的最小值小于2,则可能会丢失数据,因此请将其至少设置为2。
min.insync.replicas = 2