分析&回答


水位或水印( watermark )一词,也可称为高水位 (high watermark) ,通常被用在流式处理领域(比如Apache Flink、Apache Spark等),以表征元素或事件在基于时间层面上的进度。一个比较经典的表述为:流式系统保证在水位 t 时刻,创建时间( event time ) = t’ 且 t’ ≤ t 的所有事件都已经到达或被观测到。在 Kafka 中,水位的概念反而与时间无关,而是与位置信息相关。严格来说,它表示的就是位置信息,即位移( offset )。Kafka 源码中使用的名字是高水位 (high watermark) 。严格来说,它表示的就是位置信息,即位移(offset)。

  • log end offset:即日志末端位移,记录了该副本底层日志(log)中下一条消息的位移值。注意是下一条消息!也就是说,如果log end offset=10,那么表示该副本保存了10条消息,位移值范围是[0, 9]。
  • high watermark:即上面提到的水位值。对于同一个副本对象而言,其high watermark值不会大于log end offset值。小于等于high watermark值的所有消息都被认为是“已备份”的(replicated)。同理,leader副本和follower副本的high watermark更新是有区别的。

我们使用下图来形象化地说明两者的关系:

上图中,high watermark值是7,表示位移是0 ~ 7的所有消息都已经处于“已备份状态”(committed),而log end offset值是15,那么8 ~ 14的消息就是尚未完全备份(fully replicated)——为什么没有15?因为刚才说过了,log end offset指向的是下一条消息到来时的位移,故上图使用虚线框表示。我们总说consumer无法消费未提交消息。这句话如果用以上名词来解读的话,应该表述为:consumer无法消费分区下leader副本中位移值大于分区high watermark的任何消息。这里需要特别注意分区high watermark就是leader副本的high watermark值

如果你没了解过源码,log end offset的更新等一些列问题应该不会深入。

反思&扩展

Flink的watermark是干什么的?


喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐