1. 生产者写入数据流程

  1. 生产者先从 zookeeper 的 "/brokers/topics/主题名/partitions/分区名/state"节点找到该 partition 的 leader
  2. 生产者将消息发送给作为 leader 的 partition
  3. leader 收到消息后,将消息写入到本地 log 中
  4. follower 从 leader 上拉取消息,写入到本地 log,并向 leader 发送 ACK
  5. leader 接收到所有的 ISR 中的 Replica 的 ACK 后,并向生产者返回 ACK
  6. 生产者收到 leader 的 ACK,证明生产的数据已被 kafka 成功写入

2. 消费者消费数据流程

  • kafka 采用拉取模型,由消费者自己记录消费状态,每个消费者互相独立地顺序拉取每个分区的消息
  • 消费者可以按照任意的顺序消费消息。比如,消费者可以重置到旧的偏移量,重新处理之前已经消费过的消息;或者直接跳到最近的位置,从当前的时刻开始消费。

  1. 每个 consumer 都可以根据分配策略(默认RangeAssignor),获得要消费的分区
  2. 获取到 consumer 对应的 offset(默认从 ZK 中获取上一次消费的offset)
  3. 找到该分区的 leader,拉取数据
  4. 消费者提交 offset