当前位置: 首页 > 知识库问答 >
问题:

如果ISR小于复制因子,并且生产者ACK设置为all,那么生产者将等待多少ACK?

封梓
2023-03-14
  • RF=3,ISR=3,ACK=全部>>>发送成功
  • RF=3、ISR=2、ACK=全部>>>发送成功
  • RF=3、ISR=1、ACK=全部>>>发送成功
  • RF=3、ISR=1、acks=all、MIN.ISR.REPLICAS=3>>>发送成功!

那么,如果复制因子为4,ISR为3,并且生产者ACK设置为all,那么生产者将等待多少ACK呢?我尝试了不同的场景,真实的行为应该是什么?

共有1个答案

劳亦
2023-03-14

如果设置acks=allbroker,它是分区的领导者,将等待所有同步副本复制数据。In-sync-replica是一个与分区领导者相差不远的副本。

我的意思是不落后:在Kafka中,当一个消息被发送到一个主题分区(首先,消息被接收并存储在leader中),并且如果这个主题的复制因子大于1,那么副本代理(一个或多个)向leader代理发送提取请求,并且这个数据被复制到其他代理(一个或多个)。如果replica.lag.time.max.ms是从上一次赶上来的,则副本被认为不同步,并从ISR列表中删除。(它仍然是一个副本,可以获取消息,但leader broker没有等到它赶上来,并再次成为一个同步副本)

Kafaka文档:

broker配置中还有min.insync.replicas参数。它指定在acks=all时继续发送消息的最小同步副本数。

min.insync.replicas:当生产者将ACK设置为“全部”(或“-1”)时,min.insync.replicas指定必须确认写入的副本的最小数量,以便将写入视为成功。如果不能满足此最小值,则生成器将引发异常(NotEnoughReplicas或NotEnoughReplicasAfterAppend)。当结合使用min.insync.replicas和acks时,您可以强制执行更高的耐久性保证。一个典型的场景是创建一个复制因子为3的主题,将min.insync.replicas设置为2,并使用“all”的ACK进行生产。这将确保如果大多数副本没有收到写操作,则生成器会引发异常。

如果复制因子为4,ISR为3,并且生产者ACK设置为all,那么生产者将等待多少ACK?

bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic myTopic --describe
 类似资料:
  • Kafka文件说,幂等生产者是可能的,与相同的生产者会话,我无法理解这一点。 比方说,Kafka为每条消息添加序列号,最后一个序列号在Kafka中维护(不确定它维护在哪里)。 它是如何生成序列号的,它保存在哪里? 为什么当制作人崩溃并再次出现时,它不能保持序列? 我怎样才能使它在制作人会话之间真正幂等?

  • 我使用带有幂等生产者配置的spring kafka: 这是我的配置道具: 我的Kafka制作人抛出OutOfOrderSequence异常: 2019-03-06 21:25:47发送者[ERROR][生产者clientId=生产者-1]代理返回org.apache.kafka.common.errors.OutOfOrderSequence异常:代理在偏移-1处收到主题分区主题-1的乱序序列号。

  • 我有一个消费者作为生产者消费者模式的一部分: 简化: 如果我移除 通过将线程设置为睡眠,CPU使用率攀升到极高的水平(13%),而不是0%。 此外,如果我实例化该类的多个实例,则每个实例的CPU使用率都会以13%的增量攀升。 大约每分钟(可能每30秒)都会向BlockingCollection添加一个新的LogItem,并将适用的消息写入文件。 有没有可能线程以某种方式阻止了其他线程的运行,而系统

  • 问题内容: 刚刚开始学习多线程。我在多个线程中有5个生产者和2个消费者。基本上,该程序将100个项目添加到队列中。当队列大小为100时,生产者将停止添加。我希望消费者在消费者从队列中删除所有项目时通知生产者,以便生产者可以再次开始添加。当前,生产者将等待,但永远不会收到消费者的通知。 制片人: 消费者: 主班 问题答案: 从oracle文档页面: BlockingQueue实现是线程安全的。所有排

  • 我在这里阅读了ActiveMQ文档中的以下引用:

  • 我有一个生产者/消费者模式,如下所示 固定数量的生成器线程,每个线程写入它们自己的BlockingQueue,通过执行器调用 单个使用者线程,读取生产者线程 每个生产者都在运行一个数据库查询,并将结果写入其队列。消费者轮询所有生产者队列。目前,如果出现数据库错误,生产者线程就会死掉,然后消费者就会永远停留在产品队列中等待更多的结果。 我应该如何构造它来正确处理catch错误?