Kafka学习笔记(3)——Offset
Offset
Offset用于记录消费者上一次读取到哪里, 一般是连续递增的.
Kafka提供两种Consumer API:
High level API
: offset存放在ZooKeeper, 自动读取该Consumer Group中的last offset, 自动实现负载均衡;Low level API
: offset由消费者自己维护, 消费消息更加灵活, 但需要自己管理offset、自己实现负载均衡.
当有分区的offset不存在时, 根据auto.offset.reset
的设置, 会有几种不同的策略:
earlist
: 从头开始消费;latest
: 从最新的消息开始消费;none
: 只要该topic下有一个分区不存在已提交的offset, 就抛出异常.
HW和LEO
LEO
(Log End Offset): 当前日志文件中下一条待写入的消息的Offset, 即当前日志文件中最后一条消息的Offset+1.HW
(High Watermark): 俗称高水位, 分区ISR集合中最小的LEO即为分区的HW. 是一个特定的offset, 消费者只能拉取到HW之前的消息.
Offset更新方式
- 自动提交:
enable.auto.commit = true
, 更新的频率按照auto.commit.interval.ms
确定. 消费者fetch到消息后就更新offset, 无论消息是否消费成功. 实现At Most Once, 是Kafka默认的设置. - 手动提交:
enable.auto.commit = false
, 消费者fetch到消息后, 等到消费完成再调用consumer.commitSync()
, 手动更新offset; 如果消费失败, offset不会更新, 此消息被重复消费一次. 实现At Least Once. 如果能保证消息的幂等性, 则能实现Exactly Once.