从未如此简单:10分钟带你逆袭Kafka!( 五 )


再均衡能够给消费者组及 Broker 带来高性能、高可用性和伸缩 , 但在再均衡期间消费者是无法读取消息的 , 即整个 Broker 集群有小一段时间是不可用的 。 因此要避免不必要的再均衡 。
Offset Commit:Consumer 从 Broker 中取一批消息写入 Buffer 进行消费 , 在规定的时间内消费完消息后 , 会自动将其消费消息的 Offset 提交给 Broker , 以记录下哪些消息是消费过的 。 当然 , 若在时限内没有消费完毕 , 其是不会提交 Offset 的 。
Kafka的工作原理和过程
①消息写入算法
消息发送者将消息发送给 Broker, 并形成最终的可供消费者消费的 log , 是已给比较复杂的过程:

  • Producer 先从 Zookeeper 中找到该 Partition 的 Leader 。
  • Producer将消息发送给该 Leader 。
  • Leader 将消息接入本地的 log , 并通知 ISR 的 Followers 。
  • ISR 中的 Followers 从 Leader 中 Pull 消息, 写入本地 log 后向 Leader 发送 Ack 。
  • Leader 收到所有 ISR 中的 Followers 的 Ack 后 , 增加 HW 并向 Producer 发送 Ack , 表示消息写入成功 。
②消息路由策略
在通过 API 方式发布消息时 , 生产者是以 Record 为消息进行发布的 。
Record 中包含 Key 与 Value , Value 才是我们真正的消息本身 , 而 Key 用于路由消息所要存放的 Partition 。
消息要写入到哪个 Partition 并不是随机的 , 而是有路由策略的:
  • 若指定了 Partition , 则直接写入到指定的 Partition 。
  • 若未指定 Partition 但指定了 Key , 则通过对 Key 的 Hash 值与 Partition 数量取模 , 该取模 。
  • 结果就是要选出的 Partition 索引 。
  • 若 Partition 和 Key 都未指定 , 则使用轮询算法选出一个 Partition 。
③HW 截断机制
如果 Partition Leader 接收到了新的消息 ,ISR 中其它 Follower 正在同步过程中 , 还未同步完毕时 leader 宕机 。
此时就需要选举出新的 Leader 。 若没有 HW 截断机制 , 将会导致 Partition 中 Leader 与 Follower 数据的不一致 。
当原 Leader 宕机后又恢复时 , 将其 LEO 回退到其宕机时的 HW , 然后再与新的 Leader 进行数据同步 , 这样就可以保证老 Leader 与新 Leader 中数据一致了 , 这种机制称为 HW 截断机制 。
④消息发送的可靠性
生产者向 Kafka 发送消息时 , 可以选择需要的可靠性级别 。 通过 request.required.acks 参数的值进行设置 。
0 值:异步发送 。 生产者向 Kafka 发送消息而不需要 Kafka 反馈成功 Ack 。 该方式效率最高 , 但可靠性最低 。
其可能会存在消息丢失的情况:
  • 在传输过程中会出现消息丢失 。
  • 在 Broker 内部会出现消息丢失 。
  • 会出现写入到 Kafka 中的消息的顺序与生产顺序不一致的情况 。
1 值:同步发送 。 生产者发送消息给 Kafka , Broker 的 Partition Leader 在收到消息后马上发送成功 Ack(无需等等 ISR 中的 Follower 同步) 。
生产者收到后知道消息发送成功 , 然后会再发送消息 。 如果一直未收到 Kafka 的 Ack , 则生产者会认为消息发送失败 , 会重发消息 。
该方式对于 Producer 来说 , 若没有收到 Ack , 一定可以确认消息发送失败了 , 然后可以重发 。
但是 , 即使收到了 ACK , 也不能保证消息一定就发送成功了 。 故 , 这种情况 , 也可能会发生消息丢失的情况 。
-1 值:同步发送 。 生产者发送消息给 Kafka , Kafka 收到消息后要等到 ISR 列表中的所有副本都 同步消息完成后 , 才向生产者发送成功 Ack 。
如果一直未收到 Kafka 的 Ack , 则认为消息发送 失败 , 会自动重发消息 。 该方式会出现消息重复接收的情况 。
⑤消费者消费过程解析
生产者将消息发送到 Topitc 中 , 消费者即可对其进行消费 , 其消费过程如下: