消息队列Kafka | 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天 ✌
1. Kafka
-
消息系统 Kafka是一个分布式的、支持分区的、多副本的消息系统,其和传统的消息中间件一样都具备系统解耦、冗余存储、流量削峰、扩展、缓冲等功能,此外,Kafka还支持消息顺序性保障以及 回溯消费 的功能。
-
存储系统 在存储方面,Kafka还具有消息持久化功能和多副本机制。将消息持久化到磁盘,有效降低数据丢失的风险。因此,通过将对应数据的保留策略设置为“永久”或启用主题的日志压缩功能即可将Kafka作为长期的数据存储系统使用。
-
流式处理平台 Kafka提供了一个完整的流式处理平台,完成窗口、变换、连接和聚合等各类操作,为消息的流式处理框架提供可靠的数据来源。
2. 整体架构
Kafka体系架构包括Producer(消息发送方,将消息发送到Broker)、Broker(服务代理节点,可看作一个独立的服务节点或服务实例,负责将收到的消息存储到磁盘)、Consumer(消息接收方,采用拉(pull)模式从Broker订阅并消费消息)以及一个唯一的ZooKeeper集群(负责群元数据的管理、控制器的选举等),如下图2-1所示。
3. 基础概念
- 主题(Topic):Topic是Kafka系统中最大的消息分类单位,生产者根据所属业务将不同消息指定到不同主题。
- 分区(Partition):主题的细分,一个分区只属于一个主题,每个分区包含的消息不同。Kafka通过offset作为标识消息的唯一ID,以保证其在分区中的顺序性。(PS:因此,有序的实际是分区,而主题间不存在有序一说)
4. 工作机制
4.1 消费组和消费者机制
- 每个消费者属于唯一的一个消费组
- 两个消费组之间互不影响,但每个分区只会被分配给同一消费组中的一个消费者
- 消息投递给每个订阅其的消费组中的一个消费者
- 根据消费者分区分配策略,增加消费组中的消费者可提升其消费能力(一定时间内可处理的消息)
4.2 存储视图
Kafka的存储视图分为上层的抽象视图:主题和分区,以及实际的物理存储视图(即副本和日志层面)。为了防止 Log 过大, Kafka 又引入了日志分段(LogSegment)的概念,将 Log 切分为多个 LogSegment,相当于一个巨型文件被平均分配为多个相对较小的文件,这样也便于消息的维护和清理。Log在实际物理存储上以文件形式存储,如下图所示。
4.3 多副本机制
Kafka在分区中引入多副本机制(Replica),在同一分区的不同副本中保存相同消息,但副本之间并非完全一样,副本之间保持一主多从的关系(副本分为leader和follwer两个角色,leader负责处理读写请求,follwer与 leader 副本的消息同步)。需要注意,不同的副本应当存在不同的Broker中,当某个leader副本故障时,将从剩下的follow中选择新的leader副本负责对外服务。多副本机制为Kafka提升了容灾能力,实现了故障的自动转移。
5. 一些些个比较
Kafka VS. RabbitMQ Kafka: 流处理平台,它使应用程序能够以快速、持久的方式发布、消费和处理大量记录流 RabbitMQ:消息代理,它使使用不同消息传递协议的应用程序能够相互发送消息和接收消息
技术细节比较:
| Kafka | RabbitMQ |
|---|---|
| 支持多个消息订阅者 | 只能有一个订阅者 |
| 消息持久化 | 使用后就会被删除 |