我的一些卡夫卡消费者(但不是全部)表现出一种有趣的滞后模式。
下图显示了两个很好的示例:
深蓝色:
浅蓝色(与深蓝色相同的主题):
棕色:
两个锯齿状的客户端都可以处理比吞吐量大得多的吞吐量(通过暂停,恢复和让它们赶上来进行测试),因此它们没有达到自己的极限。
根据日志记录,有时确实会发生重新平衡,但是它的发生频率比图中的跳跃要少得多,并且少数事件也与跳跃没有及时关联。
消息也不是批量发送的。这是受影响主题之一的其他信息:
此模式从何而来?
答案 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()