我已经为我的项目用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用户的邮件列表上问过这个问题,但没有得到回复,所以问这个问题。
2条答案
按热度按时间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具有相同的吞吐量,因为只有一个副本(前导副本),所以不需要复制到跟随者。6ioyuze22#
这是关于Kafka是如何处理生产请求的。首先,kafkaproducer.send在默认情况下是异步的。Kafka普勒已经采取了大量的工作批量生产您的要求和发送给经纪人。代理将使用acking产生响应,而响应又需要等待来自远程追随者的min.insync.replicas。这就是原因。