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