kafka顺序消费&消息丢失&消息重发&重复消费

kafka顺序消费&消息丢失&消息重发&重复消费

kafka的顺序消费、重复消费以及消息丢失是在面试过程中经常会被问到三点,本文将从kafka架构生产者、broker、消费者三个角度分析

kafka架构

架构
体系结构中的角色

  • 生产者
    生产者将消息发送到topic中去,同时负责选择将message发送到topic的哪一个partition中。通过round­robin做简单的 负载均衡。也可以根据消息中的某一个关键字来进行区分。通常第二种方式使用的更多
  • 消费者
    传统的消息传递模式有2中:队列( queue) 和(publish-subscribe),kafka基于这两种模式提供了消费者组(consumer group)概念,
    • queue模式:所有的consumer都位于同一个consumer group 下。
    • publish-subscribe模式:所有的consumer都有着自己唯一的consumer group
  • broker
    kafka服务器,存储消息,多个broker组成kafka集群
  • zookeeper
    管理集群元数据、控制器选举等操作的分布式协调器

topic、partion和replication

在broker的内部设计了topic、partion和replication这三个核心概念
一张图彻底理解他们的关系
在这里插入图片描述
依图解析

  • 一个broker就是一台kafka服务器,这个kafka集群
  • 一个topic下的消息分多个partion存储,这叫replication
  • 同一个topic下的partion分布在不同的机器上
  • 每个topic都有一个leader partion
  • leader partion所在机器中的其他partion为follower partion,leader 负责所有的读写操作,follower执行leader的指令

消费者组

一张图说明
在这里插入图片描述
一句话,每个partion可以被多个消费者组中的一个消费者实例消费

回到问题

如何保证顺序消费

在这里插入图片描述

  • 同一类消息发送到同一个partion,比如订单号
  • 消费者内部起N个内存队列,同一类消息发送到同一内存队列中,同时每个内存队列对应一个线程处理

消息丢失&重发消息&重复消费

  • 生产者可能出现的问题
    在这里插入图片描述
    生产者是直接和topic的leader partion打交道的
  1. 生产者从集群中获取topic的leader partion元数据
  2. 生产者向leader partion发送消息
  3. 如果消息是需要些到指定的partion,有leader发出指令
  4. leader收到写完的ack再回复producer ack

leader partion 回复producer ack有三种机制
1. ack 0,即producer发完不管,可能丢消息
2. ack 1,leader收到消息马上回复producer ack,不管有没有把消息些到follower partion,可能丢消息
3. ack all,确保follower写入消息后再回复producer ack,如果网络抖动回复producer ack 失败,会有重发问题

  • broker 可能出现的问题
    在这里插入图片描述
    broker写入数据并不是马上刷盘的,中间有系统cache,达到一定时间或cache达到一定量才会刷盘,如果突然宕机或断电可能出现消息丢失

  • 消费者 可能出现的问题

  1. 如果设置自动ack,如果消费端挂了但自动ack 可能丢消息
  2. 如果设置手动提交ack,处理完消息后提交ack,在处理完后提交ack前挂了就可能出现重复消费

总结

深入理解kafka架构,理解topic、partion、消费者、消费者组概念,才能真正理解问题所在,理解到的才是自己的

整理不易,转载请注明出处。欢迎联系、探讨技术问题,共同进步。

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值