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