消息队列 Kafka 架构组件及其特性

Kafka

人们通常有时会将 Kafka 中的 Topic 比作队列;

在 Kafka 中,数据是以主题(Topic)的形式组织的,每个 Topic 可以被分为多个分区(Partition)。每个 Partition 是一个有序的、不可变的消息序列,这与队列的概念有些相似。

组件

一、Producer(生产者)

Kafka 为了提升消息发送速率,生产者默认采用批量发送的方式发送消息至 Broker;

一条发送多少条由参数 batch.size 决定(默认16K);

产生消息并将其发送给消息代理的应用程序或服务。生产者创建消息并将它们放入特定的消息队列或主题中。生产者是创建并发送消息的实体。它可以是一个应用程序、服务或进程。

二、Broker(服务器)

Broker 就是 kafka 的服务器,用于存储和管理消息,默认端口是9092;

生产者和 Broker 建立连接,将消息发送到服务器上存储起来;

消费者跟 Broke r建立连接,订阅和消费服务器上存储的消息;

消息处理中心。消息队列系统的核心组件,负责接收、存储和转发消息。消息代理充当生产者和消费者之间的中介,确保消息能够从一个地方安全的传输到另一个地方。

三、Consumer(消费者)

订阅,接收消息的一方叫消费者;

消费者获取消息有两种模式:Pull模式(拉)(消费者主动从消息队列中获取消息);Push模式(推)(Broker 把消息推送给消费者);

Kafka 采用的是 Pull 模式,因为 Kafka 是支持大数据的,如果采用 Push 模式的话,海量数据可能把下游消费端给打爆,所以 Kafka 采用 Pull 模式推送消息;

Pull 模式,消费者可以控制一次到底获取多少条消息(max.pull.records 默认是500)。

四、Record(消息)

客服端传输的数据叫做消息,在 Kafka 中也叫 Record;

Record 在客户端是一个 KV 键值对(ProducerRecord,ConsumerRecord);

Record 在服务端是一个 KV 键值对(RecordBatch(批量发送)或 Record)。

实际的数据单位,可以是任何类型的信息,如文本、图片等。

Topic(主题)

Topic 一个逻辑概念,可以理解为一组消息的集合;

生产者和消费者通过 topic 进行消息的写入和读取;

生产者发送消息时,若 topic 不存在,是否自动创建:auto.create.topics.enable(建议关闭);

某些消息队列系统支持 发布/订阅 模型,在这种情况下,消息会被发送到一个主题而不是直接到队列。多个消费者可以订阅同一个主题以接收该主题下的所有消息。

Partition(分区)

就是把一个topic分成几个不同的部分;

一个topic在创建时可以划分多个分区,若没有指定,默认分区数为1,可通过参数修改(num.partitions);

Kafka 中修改分区规则:可加,不可减。

Replica(副本机制)

和分区结合起来是Kafka实现高可用和负载均衡的原理

Replica(副本)是 Partition(分区)的副本,每个分区可以有若干个副本(但是不能超过集群数量);

副本必须在不同的Broker上,副本包括了主从节点(Leader,Foller);

服务端可以通过参数控制默认副本数(offsets.topic.replication.factor)(一般不这样用,一般直接通过命令设置副本数);

生产者只会往 leader 节点发送消息,消费者也只会从 leader 节点读取消息。

Segment(段)

Kafka 的数据文件是写在 .log 文件里面的,另外一起还生成对应的索引 .index 文件和对应的时间 .timeIndex 文件;

但是很容易的可以理解,如果一直往一个log文件里面追加数据,那么长时间使用之后log文件的查找会随着数据量变大而变慢,所以在这种情况下就引入了 Segment段 的概念;

Segment 的目的是:建一个分区的数据划分、存储到不同的文件中;

每个 Segment 至少由一个数据文件和2个索引文件构成,3个文件是成套出现的;

引入段的意义:加快查询效率、删除数据时减少逐条IO;

Segement 大小控制:按时间周期生成 log.roll.hours(默认一周)、按文件大小生产 log.segment.bytes(默认1G)。

Consumer Group(消费者组)

由于生产者可能短时间内生产大量消息,为了提升消息的消费速率,就增加了消费者组的概念(group id);

使用消费者组,提升消费效率和吞吐量;

同一个 Group 中的消费者,不能消费相同的分区(group id 相同,在一个组内)。

负载均衡:

在同一个消费者组内的消费者会自动分配主题中的分区。如果消费者的数量小于或等于主题的分区数,那么每个消费者将被分配到一个或多个分区;如果消费者的数量超过了分区的数量,那么多余的消费者将处于空闲状态,不会接受任何消息

高可用性和容错性:

如果某个消费者失败了或者停止运行,它的分区会被重新分配给组内的其它活跃消费者,确保消息继续被处理,这被称为再平衡(再平衡机制保证了即使有消费者假如或离开,整个组仍然能够持续稳定的消费消息)

并行处理:

通过增加同一消费者组中的消费者数量,可以提高对消息的并行处理能力。但是,最大并行度受限于主题的分区数,因为每个分区只能由一个消费者消费

消费进度跟踪:

每个消费者组维护自己的消费偏移量(Offset),记录已经消费过的消息位置。kafka默认会定期提交这些偏移量,以确保在消费者重启后可以从上次的位置继续消费

独立消费流:

不同的消费者组可以独立的消费相同主题的消息,而不会相互影响。这意味着一个主题的消息可以被多个不同的应用或服务同时消费。

Consumer Offset(偏移量)(Kafka,单分区消息顺序消费的原因)

Kafka 在单分区里面的消息是顺序存储的;

Offset(偏移量)的目的在于:记录消费者的消费位置;

Kafka 现行版本将 Offset 保存在服务器(_consumer_offsets)主题中(0.9版本以前是在zooKeeper中)

队列:存储消息的地方,直到它们被消费者获取(在某些情况下,队列可以设置为持久化,以确保即使在系统故障后消息也不会丢失)

相关推荐
阿昌喜欢吃黄桃6 天前
RocketMq事务消息原理
java·中间件·消息队列·rocketmq·mq
半夜修仙7 天前
延迟队列的介绍及常见问题
java·数据库·中间件·rabbitmq
手握风云-7 天前
一条消息的旅程:RabbitMQ 学习与实践(一)
中间件·rabbitmq
RH2312118 天前
2026.6.8Linux
java·数据库·中间件
理人综艺好会8 天前
双Token机制在实际项目中的应用与实践
中间件·token
番茄去哪了9 天前
神领物流面试题(一)
java·大数据·中间件
念何架构之路9 天前
消息中间件
中间件
都说名字长不会被发现9 天前
Spring Boot Starter 中间件账号密码加密方案设计与实现
java·spring boot·后端·中间件
瀚高PG实验室10 天前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
之歆10 天前
Day11_Express 深入解析:从中间件到项目实战
中间件·express