概念与历史
什么是消息队列?
消息队列(MQ),指保存消息的一个容器,本质上是一个队列。但与一般队列不同的是,消息队列支持高吞吐、高并发,并且高可用
消息队列的发展历程
消息队列使用场景
消息队列在实际应用中包括如下四个场景:
- 应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
- 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
- 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
- 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;
消息队列Kafka
架构设计
- Kafka的使用一般分为以下四步:创建集群->新增Topic->编写生产者逻辑->编写消费者逻辑
- Topic: 逻辑队列,一般一个Topic对应一个业务
- Cluster: 物理集群,每个Cluster中可以简练多个不同Topic
- Producer: 生产者,负责把消息发送到业务Topic中
- Consumer: 消费者,负责消费Topic中的消息
- ConsumerGroup: 消费者组,不同组Consumer之间进度互不干扰
Topic内部结构
-
Partition: 每个Topic内部的消息分区
-
Offset: 消息在Partition内部的偏移量,可理解为消息的唯一ID,在Partition内部严格递增
Partition内部结构
- Replica: 每个Partition都具有多个Replica(一般存在集群中不同broker上),这是一种容灾机制。Replica中会有一个Leader和多个Follower,生产者产生的消息会首先写入Leader,Follower会不停将信息从Leader拉取下来,实现同步
- ISR: Kafka中的一个特性,Leader和Follower之间的差距可以配置,如果Follower与Leader信息差距过大,将会被踢出队列,来保证Replica之间的消息同步。同时如果Leader所在机器宕机或者需要重启,将会在Follower之间选拔出一个新的Leader
- Broker:集群中的不同主机。Topic中的不同分区可以存储在不同Broker上,同时同一Partiton也会在不同Broker上存有Replica。不同Partiton、Replica的存储方案,将由Broker中选举出的Controller进行计算,以尽可能保证不同Broker上的负载均衡
- ZooKeeper: 负责存储集群元消息,包括分区分配消息等
从消息角度分析Kafka的高并发、高吞吐
Producer对Broker的信息发送频率是受到很大限制的。为了实现高并发、高吞吐,信息发送采用了分Batch的策略,在每个Batch中发送多个Message。同时考虑到带宽限制,会采用压缩。
Broker消息文件架构
Consumer向Broker发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口以及消息大小窗口发送给Consumer
Broker采用
零拷贝,调用了一个system call,减少了拷贝次数,加快了信息传递给Consumer的速度
Consumer Rebalance
用Coordinator实现Consumer rebalance