0

我正在使用 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

但是,我注意到两件事:

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

  2. 虽然,上述消息大致显示每个事件 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 代理不是问题。

karafka 消费者日志

将 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
4

1 回答 1

1

您可能会遇到几个问题。在没有更多细节的情况下,这只是我的猜测,但让我们试一试。

从卡夫卡的角度

您确定要在分区之间均匀分布数据吗?也许它正在从一个分区中吃掉东西?

你在这里写的:

INFO 主题 production.events 的内联处理,包含 8 条消息,耗时 2571 毫秒

这表明一个消费者总共处理了一批 8 个。这可能表明数据分布不均匀。

从性能角度

有两个性能属性会影响您对 Karafka 运行方式的理解:吞吐量和延迟。

  • 吞吐量是在给定时间内可以处理的消息数
  • 延迟是消息从生成到处理的时间。

据我了解,所有消息都在生成。您可以尝试使用 Karafka 设置,尤其是这个:https ://github.com/karafka/karafka/blob/83a9a5ba417317495556c3ebb4b53f1308c80fe0/lib/karafka/setup/config.rb#L114

从记录器的角度

正在使用的记录器会不时刷新数据,因此您不会立即看到它,而是在一段时间后看到它。您可以通过查看日志时间来验证这一点。

于 2021-06-24T08:27:07.293 回答