Spring 流侦听器轮询卡住

Spring Stream Listener Polling Stuck

我们有 Spring 分批操作的 Stream Listener mode.The 每个批次的处理时间约为 3 ms.Following 我们的配置是:

allow.auto.create.topics = true
auto.commit.interval.ms = 100
auto.offset.reset = earliest
connections.max.idle.ms = 540000
default.api.timeout.ms = 60000
enable.auto.commit = false
fetch.max.bytes = 5242880
fetch.max.wait.ms = 300000
fetch.min.bytes = 2097152
heartbeat.interval.ms = 3000
isolation.level = read_uncommitted
max.partition.fetch.bytes = 1048576
max.poll.interval.ms = 300000
max.poll.records = 500
metadata.max.age.ms = 300000
receive.buffer.bytes = 65536
reconnect.backoff.max.ms = 1000
reconnect.backoff.ms = 50
request.timeout.ms = 330000
retry.backoff.ms = 100

我们看到以下行为

May 23, 2020 @ 23:43:48.572 Consumed 463 messages  
May 23, 2020 @ 23:43:47.791 Consumed 500 messages  
--- 5 mins Gap ---                                 
May 23, 2020 @ 23:38:47.764 Consumed 17 messages   
May 23, 2020 @ 23:38:47.386 Consumed 500 messages  
May 23, 2020 @ 23:38:46.989 Consumed 500 messages  
May 23, 2020 @ 23:38:46.540 Consumed 500 messages  
--- 5 mins Gap ---                                 
May 23, 2020 @ 23:33:46.514 Consumed 106 messages  
May 23, 2020 @ 23:33:46.155 Consumed 500 messages  
May 23, 2020 @ 23:33:45.785 Consumed 500 messages  
May 23, 2020 @ 23:33:45.358 Consumed 500 messages  

我们看到在收到下一组消息之前有 5 分钟的间隔,如上所示;这种模式仍在继续。

Kafka 分区中有大量消息等待处理。所以不缺少现成的消息。

不确定为什么我们会反复沉默 5 分钟 - 我们将最大轮询等待/轮询间隔全部设置为 5 分钟。这应该没问题,因为可以在轮询时立即满足 500 条最大轮询记录。

获取最小字节为 2 MB,最大字节为 5 MB;这又可以通过我们拥有的消息数量来满足。

请让我知道我错过了什么。

我发现我必须将 max.partition.fetch.bytes 而不是 fetch.max.bytes 设置为 5MB。这使得 wait 消失了。