个人理解,可能有误,仅供参考
LSO: LastStableOffset,分区中第一个未完成事务的起始偏移量,或如果没有未完成事务则为HW。
LSO <= HW <= LEO
LSO起作用必须满足以下所有条件:
- 同一个分区多个生产者[也可以只有一个]中必须至少有一个是事务生产者;
- 该分区的消费者isolation.level 参数值必须为read_committed
在 isolation.level=read_committed 模式下:
- 消费者只能读取到 LSO 之前的消息
- 如果事务未提交,LSO 会停留在第一个未提交事务的起始偏移量
- 这意味着LSO 之后的所有消息(无论事务/非事务)都无法被读取
- 直到生产者事务提交事务,消费者才能继续消费后边的消息
示例:
有两个生产者将消息发往同一分区,一个是事务生产者,一个是非事务生产者;该分区的消费者设置参数isolation.level=read_committed。分区接收到两个生产者消息的顺序可能如下:
text
# 事务提交前
偏移量: 0 1 2 3 4
消息: A B C D E
状态: ✓ ✗ ✓ ✗ ✓ # ✓=非事务 ✗=事务消息(未提交)
HW: 5 # 所有消息都已复制到ISR
LSO: 1 # 第一个未提交事务在偏移量1
消费者可见: 只有偏移量0的消息A
消费者被阻塞在偏移量1,无法读取1-4的任何消息
# 事务提交后
LSO: 5 # 事务提交后,LSO推进到HW
消费者可见: 消息A, B, C, D, E全部可见