我一直在为我的项目使用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变为全部时,生产者吞吐量降低。我无法理解的是,如果生产者发送呼叫是火灾并且本质上是遗忘(请参见上文),并且生产者没有等待任何确认,那么为什么当我们转向更强大的保障时生产者的吞吐量会下降?
对于在Kakfa内部如何进行插接和生产者发送呼叫的任何见解,将不胜感激。
P.S。我曾在kafka用户邮件列表中询问过此问题,但没有得到答复,所以在SO上询问此情况。
答案 0 :(得分:1)
您没有在send
方法中进行回调的事实并不意味着它在基础层上被激发并忘记了。
您已经为生产者配置了3个不同的ack级别,这些ack级别确定“触发并忘记”状态。
如果acks = 0,则表示生产者发送消息,但不等待代理发出的任何acks;这才是真正的“生而死”。因此,您可以看到它提供了更高的吞吐量。
如果acks = 1,则生产者等待ack。该确认是由代理发送的(生产者已连接到该代理并托管领导者副本)。当然,这不是“一劳永逸”。
如果acks = -1,则生产者等待ack。该确认是由代理按上述方式发送的,但仅在将消息复制到其他代理上的所有副本跟随者之后才发送。当然,在这种情况下,如果您增加复制因子,则吞吐量会降低,因为在“领导者”代理将ack返回给生产者之前,消息需要由更多的代理(min.insync.replicas)进行复制。
请注意,在复制因子= 1的情况下,ack = 1和ack = -1具有相同的吞吐量,因为只有一个副本(领导者),因此无需复制到关注者。
答案 1 :(得分:0)
答案 2 :(得分:0)
我认为接受的答案是错误的,因为问题是关于吞吐量而不是延迟,并且根据合流书籍 Kafka: the definitive guide :
<块引用>如果我们的客户端代码等待来自服务器的回复(通过调用 发送消息时返回的 Future 对象的 get() 方法)它 显然会显着增加延迟(至少通过网络 往返)。如果客户端使用回调,延迟将被隐藏,但 吞吐量将受到传输中消息的数量(即, 生产者在收到回复之前将发送多少条消息 服务器)。
因此,如果使用 acks=1,all
的异步生产者,则吞吐量取决于 max.in.flight.requests.per.connection:客户端将发送的最大未确认请求数在阻塞之前的单个连接上