可以看到,消息发送成功了:

文章插图
消息消费成功:

文章插图
三、kafka 集群中的关键角色1. controller控制器如船队的指挥官,遇见有需要改变的情况时能及时做出应答,无论是船只的增减 , 抑或是航线的变更 。
每个 broker 在启动时会向 zk 创建一个临时序号节点【比如上面创建的broker节点 1,2,3】,获得的最小序号 broker 会作为集群中的 controller,负责以下几件事:
- 当集群中有一个副本的 leader 挂掉 , 需要在集群中选举出一个新的 leader,选举的规则是从 ISR 集合的最左边元素获?。ū热?ISR 集合为 【2,1,3】 , 当 leader 为 2 并且挂了时,ISR 为 【1,3】 , 就将 broker-1 上的副本作为新的 leader);
- 当集群中的 broker 新增或减少时,controller 会同步信息给其他 broker;
- 当集群中有分区新增或减少时 , controller 会同步信息给其他 broker 。
2. rebalance 机制每一个水手都有其特定的岗位,如同 Kafka 在消费者与分区间实现的再平衡——这是一种资源优化的艺术 , 和分配负载均衡的请求类似 。
在 Kafka 中,再平衡需要一个前提就是:消费组中的消费者没有指定分区来消费 。如果对消息指定了分区,rebalance 就不会生效 。
并且,当消费组中的消费组和分区关系发生变化时 , rebalance 才会触发 。这时,消息的分区会遵循以下几个策略中的一种(可配置):
- range:根据公式计算得到每个消费者去消费哪个分区 , 前面的消费者分区 = 分区总数/消费者数量+1,后面的消费者 = 分区总数/消费者数量;
- 轮询:几个消费者轮流消费分区;
- sticky:粘合策略 , 当需要 rebalance 时,会在之前已经分配的基础上调整,且不会改变之前的分配情况 。如果这个策略未打开,则需要重新进行全部分区的分配 。
3. HW 和 LEO

文章插图
HW(high-weight , 高水位)和 LEO(log-end-offset)是衡量副本最后消息位置的两个重要指标,它们就像是船上的测深仪,确保了数据不被过早或不当地处理 。
HW 是已完成 lead-follower 同步的位置,消费者无法消费到 HW 线之前的消息 。并且,在完成同步以后 , HW 线才更新,以防止消息丢失 。
LEO 是指某个副本最后消费消息的位置,根据木桶效应,HW 一定不高于 LEO 。
四、kafka 中的优化问题1. 如何防止消息丢失在 Kafka 的海域里,防止消息的丢失恰至关键 。这就需要水手精准的操作——生产者要如同技术精湛的引导者,消费者像观望远方的瞭望者 , 及时地做出反馈 。
对于生产者来说,可以采用以下方式来防止:
- 使用同步发送
- 把 ack 设为 1(0为异步进行数据复制,-1为保证有一个副本复制完成 , 1为全同步)
- 同步的分区数 >= 2
这相当于网络中的握手过程,消息包收到以后 , 给出反?。蝗绻?挥惺盏较?? ,就让发送端或者 Kafka 重新发一次,以防止消息还没消费就丢失了 。
2. 如何防止重复消费再精确的海图也免不了失误时出现 。为避免消息被重复消费 , 生产者可能需要更谨慎 , 而消费者需要有追踪每条消息唯一性的能力 。
为了防止消息丢失 , 当生产者发送完消息后,会根据有无收到 ack 应答去决定是否重新发送消息 。
当网络抖动或者其它原因,导致生产者没有收到 ack 时,消费者可能会收到两条或多条相同的消息 , 造成重复消费 。
解决方案有以下两种:
- 生产者关闭重试机制;
- 消费者消费消息时用幂等性保证:1)数据库唯一索引;2)redis 分布式锁 。
推荐阅读
- 7k Star,一款开源的 Kafka 管理平台,功能齐全、页面美观!
- 云原生数据库 GaiaDB 架构设计解析:高性能、多级高可用
- 从MySQL看主从架构高可用性实现
- 利用Apache Kafka、Flink和Druid构建实时数据架构
- 解密MongoDB集群管理:构建高可用性数据库架构
- 图解Kafka适用场景,全网最全!
- Kafka有哪些应用场景?你能说上来几个?
- YashanDB数据库主备高可用架构实践
- Kafka:解锁大数据时代的搜索与分析
- 解密Kafka主题的分区策略:提升实时数据处理的关键
