我正在使用 karafka 从主题中读取,并调用外部服务。每次调用外部服务大约需要 300 毫秒。并且在消费者组中运行 3 个消费者(k8s 中的 3 个 pod),我预计每秒可以实现 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 个 pod 上跟踪日志时,3 个 pod 中只有一个似乎一次发出日志。这对我来说没有意义。由于所有分区都有足够的事件,每个消费者应该能够并行消费。
虽然,上述消息大致显示每个事件 321 毫秒 (2571/8),但实际上我看到日志在处理两个批次之间长时间停滞。我很好奇,那个时间去哪儿了?
====== 编辑:
跨代理的数据分布存在一些偏差——因为我们最近将代理从 3 个扩展到总共 6 个。但是,没有一个代理处于 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 | 是的 | 不 |
然而,我确实看到一个消费者永远落后于另外两个消费者。下表显示了我的消费者的滞后。每个分区有一个消费者进程:
分割 | 第一次偏移 | 最后偏移量 | 消费者抵消 | 落后 |
---|---|---|---|---|
0 | 2174152 | 3566320 | 2676120 | 890200 |
1 | 2172222 | 3565605 | 3124649 | 440956 |
2 | 2172110 | 3563762 | 3185587 | 378175 |
综合滞后 | 1709331 |
这是来自所有 3 个消费者的日志的屏幕截图。consume
您可以注意到每次函数调用所花费的时间和两次相邻调用之间的间隔之间的巨大差异。基本上,我想解释和/或减少等待时间。该主题中有 100k+ 事件,我的虚拟 karafka 应用程序能够快速检索它们,因此 kafka 代理不是问题。
将 max_wait_time 设置为 1 秒(之前为 5 秒)后更新
减少等待配置后,问题似乎得到了解决。现在两个连续日志的差值大致等于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