Kafka 确认语义=1分钟,不同步副本=1重试次数=10

yrefmtwq  于 2023-01-16  发布在  Apache
关注(0)|答案(1)|浏览(129)

我很难弄清楚具有这种生产者配置的系统提供了什么样的保证

acks=1 
min.insync.replicas=1 
retries=10

前两个参数基本上为我提供了at-most-once保证,因为领导者可以写入本地存储,回复生产者,然后在复制到跟随者之前死亡。
该部分是清楚的,但是retries将意味着当生产者和集群之间存在网络问题时,领导者可能写入本地磁盘并且无法向生产者确认这一事实。在此之后,生产者将重试写入并且复制消息。
我的推理是正确的吗?这个设置在技术上没有提供特定的交付保证?或者集群上有一个进程可以防止后者发生?

6pp0gazn

6pp0gazn1#

您是正确的,前两个配置属性仅提供“最多一次”保证。
为了保证“至少一次”,您需要将acks更改为all(或-1),这将仅在ISR的所有成员(领导者和追随者)都收到记录时发送确认。
即使使用acks=all,在某些情况下,如果ISR中由于故障而只有1个副本,这仍然只能保证“最多一次”交付。
要确保acks=all始终保证“至少一次”传送,您需要将min.insyc.replicas至少设置为2(假设群集中有多个代理)。这意味着必须至少有2个复制副本已接收记录,才能将生成器写入视为成功。如果不满足min.insyc.replicas,则将引发NotEnoughReplicas异常。
回答你问题的第二部分。是的,你可以通过这个配置接收重复的消息。为了防止重复,你可以设置enable.idempotence=true
但是,当设置enable.idempotence=true时,这要求max.in.flight.requests.per.connection小于或等于5,acks必须为all,并且retries必须大于0。

相关问题