我的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。
答案 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条记录会触发投递。这可能就是您在案例中看到的情况。