处理两个连续的 kafka 批次之间的长时间延迟(使用 ruby/karafka 消费者)
Long delays between processing of two consecutive kafka batches (using ruby/karafka consumer)
我正在使用 karafka 读取主题,并调用外部服务。每次调用外部服务大约需要 300 毫秒。并且在消费者组中有 3 个消费者(3 pods in the k8s)运行,我期望达到每秒 10 个事件。我看到了这些日志行,这也证实了处理每个单独事件的 300 毫秒预期。
但是,总吞吐量并没有增加。每个 karafka 进程似乎在处理两批事件之间停滞了很长时间。
围绕 consume
方法进行检测,意味着消费者代码本身不占用时间。
https://github.com/karafka/karafka/blob/master/lib/karafka/backends/inline.rb#L12
INFO Inline processing of topic production.events with 8 messages took 2571 ms
INFO 8 messages on production.events topic delegated to xyz
但是,我注意到两件事:
当我在 3 pods 上跟踪日志时,3 个 pods 中只有一个似乎一次发出日志。这对我来说没有意义。由于所有分区都有足够的事件,并且每个消费者应该能够并行消费。
虽然上面的消息粗略显示每个事件 321 毫秒 (2571/8),但实际上我看到日志在处理两个批次之间停滞了很长时间。我很好奇,那时间去哪儿了?
======
编辑:
经纪商之间的数据分布存在一些偏差 - 因为我们最近将经纪商从 3 家增加到 6 家。但是,none 的经纪商面临 cpu 或磁盘压力.这是一个新的集群,几乎没有 4-5% cpu 在高峰期使用。
我们的数据均匀分布在 3 个分区中 - 我这样说是因为最后一个偏移量在每个分区中大致相同。
分区
第一个
偏移
上次
偏移量
尺寸
领导者
节点
副本
节点
同步
副本
节点
离线
副本
节点
首选
领导
复制不足
[0]
2174152
3567554
1393402
5
5,4,3
3,4,5
是
没有
1
2172222
3566886
1394664
4
4,5,6
4,5,6
是
没有
[2]
2172110
3564992
1392882
1
1,6,4
1,4,6
是
没有
但是,我确实看到一个消费者永远落后于另外两个消费者。
以下 table 显示了我的消费者的滞后。每个分区有一个消费者进程:
分区
第一个偏移量
上次偏移量
消费者补偿
延迟
0
2174152
3566320
2676120
890200
1
2172222
3565605
3124649
440956
2
2172110
3563762
3185587
378175
综合滞后
1709331
这是所有 3 个消费者的日志截图。您会注意到每次调用 consume
函数所花费的时间与两次相邻调用之间的间隔之间存在巨大差异。基本上,我想解释 and/or 减少等待时间。此主题中有 100k+ 个事件,我的虚拟 karafka 应用程序能够快速检索它们,因此 kafka 代理不是问题。
将max_wait_time设置为1秒后更新(之前是5秒)
减少等待配置后问题似乎解决了。现在连续两次log的差值大致等于consume
所花费的时间
2021-06-24 13:43:23.425 Inline processing of topic x with 7 messages took 2047 ms
2021-06-24 13:43:27.787 Inline processing of topic x with 11 messages took 3347 ms
2021-06-24 13:43:31.144 Inline processing of topic x with 11 messages took 3344 ms
2021-06-24 13:43:34.207 Inline processing of topic x with 10 messages took 3049 ms
2021-06-24 13:43:37.606 Inline processing of topic x with 11 messages took 3388 ms
您可能面临一些问题。这是我的猜测,没有更多细节,但让我们试一试。
从Kafka的角度
您确定您正在跨分区均匀分布数据吗?也许它正在吃掉一个分区的东西?
你在这里写了什么:
INFO Inline processing of topic production.events with 8 messages took 2571 ms
这表示有一个消费者总共处理了一批8个。这可能表明数据分布不均匀。
从性能角度
有两个性能属性会影响您对 Karafka 运行方式的理解:吞吐量和延迟。
- 吞吐量是在给定时间内可以处理的消息数
- 延迟是消息从生成到处理所用的时间。
据我了解,所有消息都在制作中。您可以尝试使用 Karafka 设置,尤其是这个设置:https://github.com/karafka/karafka/blob/83a9a5ba417317495556c3ebb4b53f1308c80fe0/lib/karafka/setup/config.rb#L114
从记录器的角度来看
正在使用的 Logger 会不时刷新数据,因此您不会立即看到它,但会在一段时间后看到。您可以通过查看日志时间来验证这一点。
我正在使用 karafka 读取主题,并调用外部服务。每次调用外部服务大约需要 300 毫秒。并且在消费者组中有 3 个消费者(3 pods in the k8s)运行,我期望达到每秒 10 个事件。我看到了这些日志行,这也证实了处理每个单独事件的 300 毫秒预期。 但是,总吞吐量并没有增加。每个 karafka 进程似乎在处理两批事件之间停滞了很长时间。
围绕 consume
方法进行检测,意味着消费者代码本身不占用时间。
https://github.com/karafka/karafka/blob/master/lib/karafka/backends/inline.rb#L12
INFO Inline processing of topic production.events with 8 messages took 2571 ms
INFO 8 messages on production.events topic delegated to xyz
但是,我注意到两件事:
当我在 3 pods 上跟踪日志时,3 个 pods 中只有一个似乎一次发出日志。这对我来说没有意义。由于所有分区都有足够的事件,并且每个消费者应该能够并行消费。
虽然上面的消息粗略显示每个事件 321 毫秒 (2571/8),但实际上我看到日志在处理两个批次之间停滞了很长时间。我很好奇,那时间去哪儿了?
====== 编辑:
经纪商之间的数据分布存在一些偏差 - 因为我们最近将经纪商从 3 家增加到 6 家。但是,none 的经纪商面临 cpu 或磁盘压力.这是一个新的集群,几乎没有 4-5% cpu 在高峰期使用。
我们的数据均匀分布在 3 个分区中 - 我这样说是因为最后一个偏移量在每个分区中大致相同。
分区 | 第一个 偏移 |
上次 偏移量 |
尺寸 | 领导者 节点 |
副本 节点 |
同步 副本 节点 |
离线 副本 节点 |
首选 领导 |
复制不足 |
---|---|---|---|---|---|---|---|---|---|
[0] | 2174152 | 3567554 | 1393402 | 5 | 5,4,3 | 3,4,5 | 是 | 没有 | |
1 | 2172222 | 3566886 | 1394664 | 4 | 4,5,6 | 4,5,6 | 是 | 没有 | |
[2] | 2172110 | 3564992 | 1392882 | 1 | 1,6,4 | 1,4,6 | 是 | 没有 |
但是,我确实看到一个消费者永远落后于另外两个消费者。 以下 table 显示了我的消费者的滞后。每个分区有一个消费者进程:
分区 | 第一个偏移量 | 上次偏移量 | 消费者补偿 | 延迟 |
---|---|---|---|---|
0 | 2174152 | 3566320 | 2676120 | 890200 |
1 | 2172222 | 3565605 | 3124649 | 440956 |
2 | 2172110 | 3563762 | 3185587 | 378175 |
综合滞后 | 1709331 |
这是所有 3 个消费者的日志截图。您会注意到每次调用 consume
函数所花费的时间与两次相邻调用之间的间隔之间存在巨大差异。基本上,我想解释 and/or 减少等待时间。此主题中有 100k+ 个事件,我的虚拟 karafka 应用程序能够快速检索它们,因此 kafka 代理不是问题。
将max_wait_time设置为1秒后更新(之前是5秒)
减少等待配置后问题似乎解决了。现在连续两次log的差值大致等于consume
所花费的时间2021-06-24 13:43:23.425 Inline processing of topic x with 7 messages took 2047 ms
2021-06-24 13:43:27.787 Inline processing of topic x with 11 messages took 3347 ms
2021-06-24 13:43:31.144 Inline processing of topic x with 11 messages took 3344 ms
2021-06-24 13:43:34.207 Inline processing of topic x with 10 messages took 3049 ms
2021-06-24 13:43:37.606 Inline processing of topic x with 11 messages took 3388 ms
您可能面临一些问题。这是我的猜测,没有更多细节,但让我们试一试。
从Kafka的角度
您确定您正在跨分区均匀分布数据吗?也许它正在吃掉一个分区的东西?
你在这里写了什么:
INFO Inline processing of topic production.events with 8 messages took 2571 ms
这表示有一个消费者总共处理了一批8个。这可能表明数据分布不均匀。
从性能角度
有两个性能属性会影响您对 Karafka 运行方式的理解:吞吐量和延迟。
- 吞吐量是在给定时间内可以处理的消息数
- 延迟是消息从生成到处理所用的时间。
据我了解,所有消息都在制作中。您可以尝试使用 Karafka 设置,尤其是这个设置:https://github.com/karafka/karafka/blob/83a9a5ba417317495556c3ebb4b53f1308c80fe0/lib/karafka/setup/config.rb#L114
从记录器的角度来看
正在使用的 Logger 会不时刷新数据,因此您不会立即看到它,但会在一段时间后看到。您可以通过查看日志时间来验证这一点。