消息队列 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中)

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

相关推荐
往日情怀酿做酒 V17639296384 小时前
Django基础之中间件
python·中间件·django
what_20184 小时前
中间件 redis安装
redis·中间件
陈沧夜5 小时前
【openssl】 version `OPENSSL_3.0.3‘ not found 问题
后端·中间件
李宥小哥6 小时前
ElasticSearch09-并发控制
中间件
ifanatic9 小时前
[每周一更]-(第127期):Go新项目-Gin中使用超时中间件实战(11)
中间件·golang·gin
李宥小哥9 小时前
ElasticSearch08-分析器详解
中间件
免檒10 小时前
基于base64Captcha实现验证码功能
开发语言·后端·中间件·gin
凡人的AI工具箱19 小时前
每天40分玩转Django:Django中间件
开发语言·数据库·后端·python·中间件·django
李宥小哥1 天前
Elasticsearch02-安装7.x
中间件