不同acks的生产者吞吐量=0,1,-1

gjmwrych  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(766)

我已经为我的项目用kafka集群做了一些性能测试。我对send call和producer的'acks'属性有疑问。我观察到下面的数字和下面的send call调用。这是一个简单的火灾和忘记电话。

producer.send(record); // fire and forget call

本主题有5个分区,我看到下面的结果,其中包含不同的acks值和复制因子。kafka集群有5个节点以默认值运行并使用本地磁盘

acks             Replication factor=1              Replication factor=3
0                  1330k msgs/sec                    1260k msgs/sec
1                  1220k msgs/sec                    1200k msgs/sec
-1(all)            1220k msgs/sec                    325k msgs/sec

正如您所看到的,当acks值从0变为all时,producer吞吐量会降低。我不能理解的是,如果生产者发送呼叫是火灾和忘记的性质(见上文)和生产者不等待任何确认,那么为什么生产者吞吐量下降,因为我们移动到更强的确认?
任何关于acks和producer send call如何在kakfa内部工作的见解都将不胜感激。
p、 我在Kafka用户的邮件列表上问过这个问题,但没有得到回复,所以问这个问题。

vshtjzan

vshtjzan1#

事实上你在电话里没有回电话 send 方法并不意味着它是在底层的火和遗忘。您已经为producer配置了3个不同级别的ack,它们决定了“fire and forget”的状态。如果acks=0,则表示生产者发送消息,但不等待来自代理的任何ack;这才是真正的“火与忘”。如您所见,它提供了更高的吞吐量。当acks=1时,生产者等待ack。此ack由代理发送(生产者连接到该代理,并且该代理承载前导副本)。当然,这不是“一发不可收拾”。当acks=-1时,生产者等待ack。此ack由代理如上所述发送,但仅在将消息复制到其他代理上的所有副本跟随者之后发送。当然,在这种情况下,如果增加复制因子,吞吐量会降低,因为在“leader”代理将ack返回给生产者之前,需要由更多代理(min.insync.replicas)复制消息。注意,当复制因子=1时,ack=1和ack=-1具有相同的吞吐量,因为只有一个副本(前导副本),所以不需要复制到跟随者。

6ioyuze2

6ioyuze22#

这是关于Kafka是如何处理生产请求的。首先,kafkaproducer.send在默认情况下是异步的。Kafka普勒已经采取了大量的工作批量生产您的要求和发送给经纪人。代理将使用acking产生响应,而响应又需要等待来自远程追随者的min.insync.replicas。这就是原因。

相关问题