Kafka消费滞后的锯齿形模式是如何形成的?

thigvfpy  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(670)

我的一些Kafka消费者(但不是全部)对他们的滞后表现出有趣的模式。
下图显示了两个很好的示例:


深蓝色:
在主题中大约每秒200条消息
32个分区
组中有1个使用者(python客户端,在kubernetes上运行)
浅蓝色(与深蓝色主题相同):
因此,在主题中,每秒大约有200条消息
还有32个分区
组中有1个使用者(也是一个python客户机,运行在kubernetes上)
棕色:
在topic中大约每秒1500条消息
40个隔板
组中有2个使用者(java/spring客户端,在kubernetes上运行)
两个sawtooth客户机都可以处理比这大得多的吞吐量(通过暂停、恢复并让它们跟上测试),因此它们没有达到自己的极限。
重新平衡有时确实会发生(根据日志),但比图表中的跳跃次数要少得多,而且少数事件也与跳跃时间不相关。
消息也不是成批发送的。以下是受影响主题之一的附加信息:



这种模式从何而来?

iugsix8n

iugsix8n1#

刚发现低频锯齿波图案不是真的。这个解释很有意思
当我使用命令行检查消费者延迟时( kafka-consumer-groups --bootstrap-server=[...] --group [...] --describe ),我看到总消费者滞后(每个分区滞后的总和)波动非常快。一度是6000左右,2秒后是1000左右,2秒后可能是9000。
然而,显示的图表似乎是基于较低频率的采样,这违反了奈奎斯特-香农采样定理。所以平均值不起作用,我们看到了云纹é 图案。
结论:锯齿形图案只是一种错觉。
为了完整起见,下面是一个模拟,描述了效果:


# !/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()

相关问题