代码之家  ›  专栏  ›  技术社区  ›  Tobias Hermann

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

  •  0
  • Tobias Hermann  · 技术社区  · 6 年前

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

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

    深蓝色:

    • 主题中每秒大约有200条消息
    • 32个分区
    • 1组用户(python客户机,在kubernetes上运行)

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

    • 所以主题中每秒大约有200条消息
    • 所以还有32个分区
    • 组中的1个使用者(也是运行在kubernetes上的python客户机)
    布朗:

    • 主题中大约每秒1500条消息
    • 40个分区
    • 组中的2名消费者(Java/Spring Client,运行于KubNeNETs)

    两个锯齿客户机都可以处理比这大得多的吞吐量(通过暂停、恢复和让他们赶上来测试),因此他们不在自己的限制范围内工作。

    重新平衡有时会发生(根据日志),但比图中的跳转要少得多,并且少数事件也不会在时间上与跳转关联。

    这些消息也不会成批发送。以下是受影响主题之一的附加信息:

    这种模式从何而来?

    enter image description here

    深蓝:

    • 主题中每秒大约有200条消息
    • 32分区
    • 1组用户(python客户机,运行在kubernetes上)

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

    • 所以主题中每秒大约有200条消息
    • 所以还有32个分区
    • 组中的1个使用者(也是一个在kubernetes上运行的python客户机)

    布朗:

    • 主题中大约每秒1500条消息
    • 40分区
    • 组中的2个消费者(Java/Spring Client,运行在KubNeNes上)

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

    重新平衡有时会发生(根据日志),但比图中的跳转要少得多,并且少数事件也与跳转没有时间关联。

    这些消息也不会成批发送。以下是受影响主题之一的附加信息:

    enter image description here

    enter image description here

    enter image description here

    这种模式从何而来?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Tobias Hermann    6 年前

    刚发现低频锯齿状花纹是不真实的。这个解释很有趣。;

    当我使用命令行( kafka consumer groups--bootstrap server=[…]--group[…]--describe )检查使用者延迟时,我看到总的使用者延迟(每个分区的延迟总和)波动非常快。在某一点上它大约是6000,2秒后它大约是1000,2秒后它可能是9000。

    然而,所示图表似乎是基于以较低频率采集的样本,这违反了 nyquist_“shannon sampling thermo定理 。因此平均值不起作用,我们看到a moir pattern

    结论:锯齿状图案只是一种错觉。


    为了完整起见,这里有一个模拟描述了效果:

    <预先> <代码>!/usr/bin/env python3号 “模拟卡夫卡消费滞后图的莫尔效应。 “” 随机进口 将matplotlib.pyplot导入为plt def x_noise_sampling()->int: 返回31+random.randint(-6,6) def main()->无: Max x=7000 采样率=97 xs=列表(范围(max_x)) ys=[x%100对于x in xs] xs2=[x+x_noise_sampling()对于范围内的x(0,max_x-100,采样率)] ys2=[ys[x2]对于xs2中的x2] PLT.图(图尺寸=(16,9)) plt.xlabel('时间') XTICK([]) (y]) plt.ylabel('消费者滞后') 信号,=plt.图(xs,ys,'-') 样品,=plt.图(xs2,ys2,'bo') 内插,=plt.图(xs2,ys2,'-') PLT.图例([信号,样本,内插]、[信号]、[样本]、[内插样本]) plt.savefig('锯齿云纹.png',dpi=100) 显示() 如果“名称”= 主体() < /代码>

    使用命令行( 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