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.