bigywater.tech
Kafka 内部原理 · 58

Consumer Lag 到底怎么算

写10000条消息只消费提交3000条,用kafka-consumer-groups.sh --describe真实验证CURRENT-OFFSET、LOG-END-OFFSET、LAG三个数字之间精确的关系。

7000
真实观测到的LAG,精确等于10000-3000
两数相减
LAG的计算真实没有任何黑箱逻辑

验证:写1万条,只消费并提交3000条

命令 · python for i in range(10000): p.produce("lag-demo", value=str(i).encode()) p.flush() c = Consumer({"group.id": "lag-test-group", "enable.auto.commit": False}) count = 0 while count < 3000: m = c.poll(1.0) if m: count += 1 c.commit()

验证:LAG真实就是LOG-END-OFFSET减CURRENT-OFFSET,一步都不绕弯

命令 · shell $ kafka-consumer-groups.sh --bootstrap-server localhost:19092 --describe --group lag-test-group
真实实测 · 本机执行输出
GROUP           TOPIC     PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG
lag-test-group  lag-demo  0          3000            10000           7000
CURRENT-OFFSET真实是这个消费组在这个分区上最后一次提交的offset(本文场景里是3000);LOG-END-OFFSET真实是这个分区当前真实写到的最新位置(10000);LAG真实精确等于两者之差(7000)——没有任何加权、平滑或者估算,就是两个真实的offset数字相减。这也是为什么"lag"这个指标真实反映的是"消费组认为自己在哪、分区真实到哪了"这两点之间的差距,而不是"还有多少条消息没被处理完"——如果consumer拉到了消息但处理逻辑还没跑完就崩溃、offset也没提交,这些消息真实依然会被计入lag,哪怕它们已经被"看到"过一次。

分步演示:LAG真实是怎么算出来的

每一步都是本文上面用kafka-consumer-groups.sh跑出来的原始结果。

LAG就是两个真实offset数字的减法
这一步新验证的数值

    参考与说明

    • 数据来自本机3节点Kafka 4.3.1集群,topic lag-demo,consumer手动提交offset。
    • 和《Lag 很高时,问题可能发生在哪》一起看:这篇给出LAG的精确定义,下一篇看LAG真实是怎么随时间变化、暴露出问题的。
    京ICP备2026067502号-1京公网安备11010502063487号