Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 困惑于使用新的Kafka幂等生产者API防止重复_Apache Kafka_Kafka Producer Api_Spring Kafka - Fatal编程技术网

Apache kafka 困惑于使用新的Kafka幂等生产者API防止重复

Apache kafka 困惑于使用新的Kafka幂等生产者API防止重复,apache-kafka,kafka-producer-api,spring-kafka,Apache Kafka,Kafka Producer Api,Spring Kafka,我的应用程序有5个以上的消费者在一个卡夫卡主题上使用了5个分区。(使用卡夫卡版本11)我的消费者每个都会生成一条到另一个主题的消息,然后将一些状态保存到数据库中,然后手动执行即时确认并移动到下一条消息 我试图解决这样一种情况,即当它们成功地向出站主题发送消息时。那么我们就失败了/失去了消费者。当另一个使用者接管分区时,它将向出站主题发出另一条消息。这很糟糕:( 我发现卡夫卡现在有幂等生产者,但据我所知,它只保证生产者会话 “当生产者重新启动时,将分配新的PID。因此,幂等性仅承诺用于单个生产者会

我的应用程序有5个以上的消费者在一个卡夫卡主题上使用了5个分区。(使用卡夫卡版本11)我的消费者每个都会生成一条到另一个主题的消息,然后将一些状态保存到数据库中,然后手动执行即时确认并移动到下一条消息

我试图解决这样一种情况,即当它们成功地向出站主题发送消息时。那么我们就失败了/失去了消费者。当另一个使用者接管分区时,它将向出站主题发出另一条消息。这很糟糕:(

我发现卡夫卡现在有幂等生产者,但据我所知,它只保证生产者会话

“当生产者重新启动时,将分配新的PID。因此,幂等性仅承诺用于单个生产者会话”-(博客)

在我的用例中,关键是当我在另一个消费者上重播消息时,它不会复制出站消息


有什么我遗漏的吗?

在使用事务时,不应该使用任何基于使用者的机制(手动或其他)来提交偏移量

相反,您使用生产者将偏移发送到事务,以便偏移提交是事务的一部分

如果使用
KafkaTransactionManager
ChainedKafkaTransactionManager
配置,则当侦听器正常退出时,Spring侦听器容器将向事务发送偏移量

如果不使用Kafka事务管理器,则需要使用
KafkaTemplate
(或
Producer
(如果使用本机API),将偏移发送到事务

使用使用者提交偏移量不是事务的一部分,因此事情不会按预期进行


当使用事务管理器时,侦听器容器将
生产者
绑定到线程,以便任何下游
KafkaTemplate
操作都参与消费者启动的事务。请参阅。

这里并不完全清楚您在哪里提交消费者补偿。我会在您确认生产者后进行假设d消息。这将使您处于读-处理-写模式,您可能希望使用Kafka流或实现自己的事务生成器幂等生成器。这里不适合使用生成器。谢谢您的建议。我明天将不得不进一步研究它。似乎事务id很难实现。您不应该使用使用者来提交使用事务时的t偏移量-参见我的答案。啊,我不知道事务会提交消费者和生产者确认。