处理两个连续的 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

但是,我注意到两件事:

  1. 当我在 3 pods 上跟踪日志时,3 个 pods 中只有一个似乎一次发出日志。这对我来说没有意义。由于所有分区都有足够的事件,并且每个消费者应该能够并行消费。

  2. 虽然上面的消息粗略显示每个事件 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 会不时刷新数据,因此您不会立即看到它,但会在一段时间后看到。您可以通过查看日志时间来验证这一点。