为什么我的 Kafka 消费者民意调查这么快?

xer*_*ge2 5 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/

  • 获取最小字节数

  • 服务器应为获取请求返回的最小数据量。如果可用数据不足,请求将等待积累足够多的数据,然后再答复请求。默认设置为 1 字节,意味着只要有一个字节的数据可用,或者获取请求在等待数据到达时超时,就会立即应答获取请求。将其设置为大于 1 将导致服务器等待大量数据的积累,这可以稍微提高服务器吞吐量,但会带来一些额外的延迟。

  • fetch.max.wait.ms

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

fetch.max.wait.ms=5000,
fetch.min.bytes=99988800
Run Code Online (Sandbox Code Playgroud)

根据我的配置选项和数据集,我希望调用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
Run Code Online (Sandbox Code Playgroud)

没有真正接近 5 秒的延迟。

Spa*_*vić 4

对于财产,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 秒。