kafka顺序消费&消息丢失&消息重发&重复消费
kafka的顺序消费、重复消费以及消息丢失是在面试过程中经常会被问到三点,本文将从kafka架构生产者、broker、消费者三个角度分析
kafka架构
体系结构中的角色
- 生产者
生产者将消息发送到topic中去,同时负责选择将message发送到topic的哪一个partition中。通过roundrobin做简单的 负载均衡。也可以根据消息中的某一个关键字来进行区分。通常第二种方式使用的更多 - 消费者
传统的消息传递模式有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打交道的
- 生产者从集群中获取topic的leader partion元数据
- 生产者向leader partion发送消息
- 如果消息是需要些到指定的partion,有leader发出指令
- 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达到一定量才会刷盘,如果突然宕机或断电可能出现消息丢失 -
消费者 可能出现的问题
- 如果设置自动ack,如果消费端挂了但自动ack 可能丢消息
- 如果设置手动提交ack,处理完消息后提交ack,在处理完后提交ack前挂了就可能出现重复消费
总结
深入理解kafka架构,理解topic、partion、消费者、消费者组概念,才能真正理解问题所在,理解到的才是自己的
整理不易,转载请注明出处。欢迎联系、探讨技术问题,共同进步。