为什么我的Kafka消费者如此快速地投票?

时间:2019-07-05 21:42:24

标签: java apache-kafka kafka-consumer-api spring-kafka

我的Kafka消费者的轮询速度比我预期的要快。我可以更改一些配置以使其在fetch.max.wait.ms中一直等待吗?

我将fetch.max.wait.ms设置为一定的秒数(5)。我将fetch.min.bytes设置为大量字节(99,988,800)。

我阅读了文档(但可能遗漏了一些内容):

  

https://kafka.apache.org/documentation/

     
      
  • fetch.min.bytes

  •   
  • 服务器应为获取请求返回的最小数据量。如果没有足够的数据,则请求将等待该数据积累,然后再回答请求。默认设置为1字节,这意味着只要有一个字节的数据可用,或者提取请求超时等待数据到达,就将对提取请求进行应答。将此值设置为大于1的值将导致服务器等待大量数据累积,这可以以一些额外的延迟为代价来提高服务器吞吐量。

  •   
  • fetch.max.wait.ms

  •   
  • 如果没有足够的数据立即满足fetch.min.bytes给出的要求,服务器将在响应提取请求之前阻塞的最长时间。

  •   
fetch.max.wait.ms=5000,
fetch.min.bytes=99988800

根据我的配置选项和数据集,我希望对poll的调用在返回任何记录之前总是阻塞5秒钟。

相反,对poll的调用有时会在不到一秒钟的时间内解决,并且总是有一些小记录。

这是示例运行的输出:

// send 100 records
// doesn't matter how

// timestamp -> records received
// (date, hour and minute are not shown, just the relevant seconds.millis)

32.475 -> 10
33.392 -> 12
34.116 -> 16
37.477 -> 16
38.395 -> 18
39.118 -> 17
42.479 -> 7
43.397 -> 4

没有延迟真的接近5s。

2 个答案:

答案 0 :(得分:2)

使用属性fetch.max.wait.ms=5000,您说:“即使没有足够的数据要提取,也不要等待超过5秒”。在执行轮询之前,您没有指定最小秒数。您可以通过启动2个kafka使用者来测试此行为,并在其中一个中设置fetch.max.wait.ms=20000,在另一个中保留默认值。您会看到,在使用默认设置的使用者中,您几乎会立即收到消息,而在使用fetch.max.wait.ms=20000的使用者中,您将需要稍等片刻。我在机器上通过设置fetch.max.wait.ms=20000进行了尝试,有时需要15秒才能接收记录,有时需要10秒,等等,但是从不超过20秒。

答案 1 :(得分:0)

您还需要调整 max.partition.fetch.bytes、message.max.bytes 和 max.message.bytes。 如果每条记录的大小在100KB左右,10条记录会触发投递。这可能就是您在案例中看到的情况。