千斤顶变化时的生产者吞吐量= 0,1,-1

时间:2018-11-19 09:32:39

标签: java apache-kafka kafka-producer-api

我一直在为我的项目使用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上询问此情况。

3 个答案:

答案 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)

这是关于kafka如何处理农产品请求的内容。 首先,默认情况下KafkaProducer.send是异步的。 KafkaProducer已大量处理您的农产品请求并发送给经纪人。代理将确认产生响应,从而需要等待远程跟随者的min.insync.replicas。这就是原因。

答案 2 :(得分:0)

我认为接受的答案是错误的,因为问题是关于吞吐量而不是延迟,并且根据合流书籍 Kafka: the definitive guide :

<块引用>

如果我们的客户端代码等待来自服务器的回复(通过调用 发送消息时返回的 Future 对象的 get() 方法)它 显然会显着增加延迟(至少通过网络 往返)。如果客户端使用回调,延迟将被隐藏,但 吞吐量将受到传输中消息的数量(即, 生产者在收到回复之前将发送多少条消息 服务器)。

因此,如果使用 acks=1,all 的异步生产者,则吞吐量取决于 ma​​x.in.flight.requests.per.connection:客户端将发送的最大未确认请求数在阻塞之前的单个连接上