kakka 消息写入工作原理

kakka 消息写入工作原理_第1张图片

消息路由策略

  • productor 选取 partition 分区的策略(broker contorller 将当前 topic 所有的partition leader 返回给 productor )
  1. 直接指定了partition,则直接写入到partition
  2. 没有指定paritition,但是指定了key,通过key的hash值与 partition 数量取模,该取模的结果就是要选出的partiton索引
  3. 若 partition 和key 都没有指定,轮询算法选一个

消息写入算法

  1. 生成者 向 broker 提交连接请求,连接上的任意broker 都会向其发送 broker controller 的通信url
  2. 生成者 指定要消费的topic, broker controller 接受到请求后,从zk中查找指定topic 的所有 partition 的leader 。返回给生成者
  3. 生产者 接受到 leader 的列表后, 根据消息路由策略选择要发送的 partition leader。将消息发出
  4. leader 将消息写入到 本地log。 并通知isr 中的 follower
  5. isr 中的followers 从leader 同步信息后,向leader 响应ack
  6. leader 收到所有的ack后, 增加HW, 标识消费者可以消费到该位置了。

消息写入过程存在哪些问题?

  1. leader 接受到消息后,宕机怎么办,leader 可能因为网络问题,接不到消息?
  2. partition leader 选举的过程中 ISR 列表中没有从节点怎么办?
  3. leader 没有收到所有的ack的时候,宕机了。会存在问题?
  4. 生产者生产消息后,broker 没有给返回ack,超时后,重新提交消息问题

1.消息发送可靠性机制

  • 通过配置可靠性级别 ack 参数的值进行设置
  • 0 值, 异步发送,生产者 发送消息后,不需要 kafka 反馈成功ack。效果高。可靠性低。有可能存在消息丢失
  • 1 值,同步发送,partition leader 收到消息后, 马上发送成长ack。存在的问题 是 当leader收到消息后, 还没有向follower 同步, leader 挂了。原来写入到leader 中的消息丢失了。
  • -1 值,同步发送,当所有partition的副本都同步完消息后, 才能向生产者发送ack。如果超时后, 生产者会自动重发。 很少出现消息丢失。存在重复消息接受情况。kafka 运行为消息生成唯一标识。允许用户自定义去重。

2. partition leader的选举范围

  • ISR 列表中没其他副本的时候 。可以通过 参数 unclean.leader.election.enable 取值 设置leader 选举
  • false 标识有副本活过来 才进行选举,该策略可靠性有保证。但是可用性低
  • true 标识从任何没有宕机的follower 中选一个,可能存在大量的消息丢失。可靠性没有保障

3. HW 截断机制

leader 收到消息后,ISR 中其它Follower 正在进行同步过程中,还未同步完毕。leader 宕机。会出现 paritition中的 leader 和follower的数据不一致。使用截断。当leader 恢复后,将其从leo回退到 其宕机时候的HW。然后再与新的leader 进行数据同步。

(HW截断机制可能会引发消息的丢失)

你可能感兴趣的:(kakka 消息写入工作原理)