我很难弄清楚具有这种生产者配置的系统提供了什么样的保证
acks=1
min.insync.replicas=1
retries=10
前两个参数基本上为我提供了at-most-once
保证,因为领导者可以写入本地存储,回复生产者,然后在复制到跟随者之前死亡。
该部分是清楚的,但是retries
将意味着当生产者和集群之间存在网络问题时,领导者可能写入本地磁盘并且无法向生产者确认这一事实。在此之后,生产者将重试写入并且复制消息。
我的推理是正确的吗?这个设置在技术上没有提供特定的交付保证?或者集群上有一个进程可以防止后者发生?
1条答案
按热度按时间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。