卡夫卡幂等制片人

时间:2018-08-08 05:36:08

标签: apache-kafka

kafka文件说,幂等的生产者可以在同一生产者会话中使用,而我对此一无所知。

说,Kafka为每条消息添加序列号,最后一个序列号保存在kafka中(不确定在哪里维护)。

它如何生成序列号以及保留在哪里?

当生产者崩溃并再次出现时,为什么不能保持顺序?

我如何才能使它真正成为制作者会议的幂等?

谢谢

3 个答案:

答案 0 :(得分:3)

幂等生产者仅在生产者过程的生命期内具有保证。如果崩溃,则新的幂等生产者将具有不同的ProducerId,并将开始其自己的序列。

序列号仅从0开始,并且对于每个记录单调递增。如果记录传递失败,则将使用现有序列号再次发送该记录,以便代理可以对它进行重复数据删除(如果需要)。序列号是每个生产者和每个分区。

目前,Kafka没有提供“继续”幂等生产者会话的方法。每次启动时,它都会获得一个新的唯一的ProducerId(由集群生成)

答案 1 :(得分:1)

这是Kafka所缺少的一项功能,而且我认为如果不修改Kafka本身,就不会找到一种优雅而有效的解决方案。

初步,如果您想在任何故障(生产者或经纪人)上获得真正的同等性,那么您absolutely positively need在业务层中使用某种 id (而不是较低级别的传输)层)。

您可以在Kafka中使用这样的ID来执行以下操作:您的生产者至少一次写入主题 ,然后您就拥有了一个Kafka Streams流程,可以使用您的业务对该主题中的消息进行重复数据删除层ID,并将剩余的唯一消息发布到另一个主题。为了提高效率,您应该使用单调递增的ID(也称为序列号),否则,您将不得不保持(并坚持)您所见过的每个ID,这会导致内存泄漏,除非您将重复数据删除功能限制在最近的x天/小时/分钟,并且仅保留最新ID。

或者,您可以尝试 Apache Pulsar ,除了解决Kafka的其他痛处(必须进行昂贵的手动操作和容易出错的重新平衡以扩展主题),仅举一例。一个)has this feature built in

答案 2 :(得分:0)

仅当生产者不崩溃时,配置“幂等”才起作用。

但是,通过事务处理,您可以跨不同分区发送数据一次。 您使用您的生产者ID(自动创建)设置了交易ID。 如果新的生产者ID与相同的交易ID一起到达,则表示您有问题。 然后,记录将只写入一次。