卡夫卡消费者滞后的锯齿状模式如何出现?

时间:2018-09-25 08:58:13

标签: apache-kafka kafka-consumer-api spring-kafka kafka-python

我的一些卡夫卡消费者(但不是全部)表现出一种有趣的滞后模式。

下图显示了两个很好的示例:

enter image description here

enter image description here

深蓝色:

  • 大约每秒200条消息在主题中
  • 32个分区
  • 组中的1个使用者(Python客户端,在Kubernetes上运行)

浅蓝色(与深蓝色相同的主题):

  • 主题每秒大约有200条消息
  • 还有32个分区
  • 组中有1个使用者(也是Python客户端,在Kubernetes上运行)

棕色:

  • 大约每秒1500条主题消息
  • 40个分区
  • 组中的2个使用者(Java / Spring客户端,在Kubernetes上运行)

两个锯齿状的客户端都可以处理比吞吐量大得多的吞吐量(通过暂停,恢复和让它们赶上来进行测试),因此它们没有达到自己的极限。

根据日志记录,有时确实会发生重新平衡,但是它的发生频率比图中的跳跃要少得多,并且少数事件也与跳跃没有及时关联。

消息也不是批量发送的。这是受影响主题之一的其他信息:

enter image description here

enter image description here

enter image description here

此模式从何而来?

1 个答案:

答案 0 :(得分:1)

仅发现低频锯齿图案不是真实的。而且解释很有趣。 ;)

当我使用命令行(kafka-consumer-groups --bootstrap-server=[...] --group [...] --describe)检查使用者延迟时,我发现总的使用者延迟(每个分区的延迟之和)波动非常快。某一时刻大约是6000,2秒后大约是1000,再次2秒后可能是9000。

然而,所示的图表似乎是基于较低频率采样的,这违反了Nyquist–Shannon sampling theorem。因此求平均值不起作用,我们看到了Moiré pattern

结论:锯齿形只是一种错觉。


为完整起见,这是描述效果的模拟:

#!/usr/bin/env python3
"""Simulate moire effect of Kafka-consumer-lag graph.
"""

import random

import matplotlib.pyplot as plt


def x_noise_sampling() -> int:
    return 31 + random.randint(-6, 6)


def main() -> None:
    max_x = 7000
    sample_rate = 97
    xs = list(range(max_x))
    ys = [x % 100 for x in xs]
    xs2 = [x + x_noise_sampling() for x in range(0, max_x - 100, sample_rate)]
    ys2 = [ys[x2] for x2 in xs2]

    plt.figure(figsize=(16, 9))
    plt.xlabel('Time')
    plt.xticks([])
    plt.yticks([])
    plt.ylabel('Consumer lag')
    signal, = plt.plot(xs, ys, '-')
    samples, = plt.plot(xs2, ys2, 'bo')
    interpolated, = plt.plot(xs2, ys2, '-')
    plt.legend([signal, samples, interpolated], ['Signal', 'Samples', 'Interpolated samples'])
    plt.savefig('sawtooth_moire.png', dpi=100)
    plt.show()


if __name__ == '__main__':
    main()

enter image description here