1. 什么是消息中间件?
消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
2. Kafka 是什么,有什么作用?
Kafka 是一个分布式的流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。
主要功能体现在以下 3 点:
-
消息系统:Kafka与传统的消息中间件都具备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。与此同时,Kafka 还提供了大多数消息系统难以实现的消息顺序性保障及回溯性消费的功能;
-
存储系统:Kafka 把消息持久化到磁盘。相比于其他基于内存存储的系统而言,有效的降低了消息丢失的风险。这得益于其消息持久化和多副本机制。也可以将Kafka 作为长期的存储系统来使用。只需要把对应的数据保留策略设置为“永久”或启用主题日志压缩功能;
-
流式处理平台:Kafka 为流行的流式处理框架提供了可靠的数据来源还提供了一个完整的流式处理框架,比如窗口、连接、变换和聚合等各类操作。
3. Kafka 的架构是怎么样的?
一个典型的 Kafka 体系架构包括若干 Producer、若干 Consumer、以及一个 ZooKeeper 集群。
注意:在 2.8.0 版本中,Kafka 移除了 Zookeeper,通过 KRaft 进行集群管理。
Producer 将消息发送到 Broker,Broker 负责将受到的消息存储到磁盘中,而 Consumer 负责从 Broker 订阅并消费消息。
Kafka 基本概念:
-
Producer 生产者:负责将消息发送到 Broker;
-
Consumer 消费者:从 Broker 接收消息;
-
Consumer Group 消费者组:由多个 Consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费,消费者组之间互不影响。所有消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者;
-
Broker:可以看做一个独立的 Kafka 服务节点或 Kafka 服务实例。如果一台服务器上只部署了一个 Kafka 实例,那么我们也可以将 Broker 看做一台 Kafka 服务器;
-
Topic:一个逻辑上的概念,包含很多 partition,同一个 topic 下的 partition 的消息内容是不相同的;
-
Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker 上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列;
-
Replica 副本:同一分区的不同副本保存的是相同的消息。为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 Kafka 仍然能够继续工作,Kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower;
-
Leader :每个分区的多个副本中的"主副本",生产者以及消费者只与 leader 交互;
-
Follower :每个分区的多个副本中的"从副本",负责实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,从 follower 副本中重新选举新的 leader 副本对外提供服务。
4. Kafka Replicas 是怎么管理的?
-
AR:分区中的所有 Replica 统称为 AR;
-
ISR:所有与 leader 副本保持一定程度同步的Replica(包括 leader 副本在内)组成 ISR;
-
OSR:与 leader 副本同步滞后过多的 Replica 组成了 OSR。
leader 负责维护和跟踪 ISR 集合中所有 follower 副本的滞后状态。
当 follower 副本落后过多时,就会将其放入 OSR 集合。当 follower 副本追上了 leader 的进度时,就会将其放入 ISR 集合。
默认情况下,只有 ISR 中的副本才有资格晋升为 leader。
5. 如何确定当前能读到哪一条消息?
分区相当于一个日志文件。我们先简单介绍几个概念:
上图是一个分区日志文件:
-
标识共有 7 条消息,offset (消息偏移量)分别是 0~6;
-
0 代表这个日志文件的开始;
-
HW(High Watermark)为 4。0~3 代表这个日志文件可以消费的区间,消费者只能消费到这 4 条消息;
-
LEO 代表即将要写入消息的偏移量 offset。
分区 ISR 集合中的每个副本都会维护自己的 LEO,而 ISR 集合中最小的 LEO 即为分区的 HW。
如上图所示,3 个分区副本都是 ISR 集合当中的。最小的 LEO 为 3,就代表分区的 HW 为3。
所以,当前分区只能消费到 0~2 之间的 3 条数据,如下图: