复制因子应该是在 Apache Kafka 中提供最多一次交付语义的一个吗?

问题描述

据我所知,生产者不得重试任何失败的发送, 并且消费者必须在执行某些处理之前提交以提供最多一次交付语义。 但是复制因子是否也与交付语义相关联? reactor-kafka 中示例项目中的 annotation 如下所示:

复制因子为 1 的主题与 acks=0 且不重试的生产者相结合,确保第一次尝试时无法发送到 Kafka 的消息将被丢弃

复制因子应该是在 Apache Kafka 中提供最多一次交付语义的一个吗?

解决方法

我认为最多一次的概念主要与消费者相关,与复制因子无关。相反,从生产者的角度来看,我认为这句话是正确的,因为生产者不会等待 ack 并且只有一个副本存在(不可能进行故障转移)。

如果您在消费者上禁用自动提交并调用 commitSync 以在收到消息后且在处理之前立即确认消息(提交偏移量),那么您将强制执行最多一次传递语义。此时,如果消费者由于某种异常无法处理消息,则消息丢失。好吧,它仍然存储在 Kafka 中,但是消费者已经移过了消息的偏移量,并且在没有手动重置偏移量的情况下无法恢复它。