首页 > 解决方案 > 不同 acks=0,1,-1 的生产者吞吐量

问题描述

我一直在为我的项目使用 kafka 集群进行一些性能测试。我对发送调用和生产者的“acks”属性有疑问。我观察到下面的数字与下面的发送调用调用。这是一个简单的“开火即忘”电话。

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

该主题有 5 个分区,我看到下面的结果具有不同的 ack 值和复制因子。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,生产者吞吐量降低。我无法理解的是,如果生产者发送调用本质上是触发并忘记(见上文)并且生产者不等待任何确认,那么为什么生产者吞吐量会随着我们转向更强的 Acks 保证而下降?

任何关于 Acks 和 producer send call 如何在 Kakfa 内部工作的见解都将不胜感激。

PS 我曾在 kafka 用户邮件列表上问过这个问题,但没有得到回复,所以在 SO 上问这个问题。

标签: javaapache-kafkakafka-producer-api

解决方案


你没有回调的事实send方法并不意味着它在底层就火了就忘记了。您已经为生产者配置了 3 个不同级别的 ack,它们决定了“即发即弃”状态。acks = 0 表示生产者发送消息但不等待代理的任何确认;这是真正的“一劳永逸”。如您所见,它提供了更高的吞吐量。当 acks = 1 时,生产者等待 ack。此 ack 由代理(生产者连接到该代理并托管领导者副本)发送。当然,这不是“一劳永逸”。当 acks = -1 时,生产者等待 ack。如上所述,此 ack 由代理发送,但仅在将消息复制到其他代理上的所有副本追随者之后。当然,在这种情况下,如果您增加复制因子,吞吐量会降低,因为在“领导者”代理将 ack 返回给生产者之前,消息需要被更多代理(min.insync.replicas)复制。请注意,在复制因子 = 1 的情况下,ack = 1 和 ack = -1 具有相同的吞吐量,因为只有一个副本(领导者),因此无需复制到跟随者。


推荐阅读