Kafka 介绍

jasmine 于 2021-12-10 发布

什么是消息队列

“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。

消息队列的两种模式

什么是Kafka

Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台 它同时也是一款开源的基于发布订阅模式的消息引擎系统。

重要概念

event-stream-topic

1)生产者(producer)
发出消息的服务

2)消费者(consumer)
读取消息的服务

3)主题(topic)

概念类比:数据库表

相当于消息的分类,一个topic里存放同一类消息,消费者订阅这个topic就会消费里面的消息

4)分区(partition)

概念类比:数据库分表中的一张表,包含部分数据

Topic 被分成多个 Partition 分区。 Topic 是一个逻辑概念,Partition 是最小的存储单元,掌握着一个 Topic 的部分数据。 每个 Partition 都是一个单独的 log 文件,每条记录都以追加的形式写入。

5)副本(Follower)

类比:从库中的备份表

Kafka 为一个 Partition 生成多个副本,并且把它们分散在不同的 Broker。
如果一个 Broker 故障了,Consumer 可以在其他 Broker 上找到 Partition 的副本,继续获取消息。

6)偏移量(Offset)

概念类比:分布式系统中的自己生成的ID

Partition 中的每条记录都会被分配一个唯一的序号,称为 Offset(偏移量)。 Offset 是一个递增的、不可变的数字,由 Kafka 自动维护。 当一条记录写入 Partition 的时候,它就被追加到 log 文件的末尾,并被分配一个序号,作为 Offset。

event-stream-topic

如上图,这个 Topic 有 3 个 Partition 分区,向 Topic 发送消息的时候,实际上是被写入某一个 Partition,并赋予 Offset。

7)Broker
一个 Kafka 集群由多个 Broker(就是 Server) 构成,其实broker就是一个线程,每个 Broker 中含有集群的部分数据。
Kafka 把 Topic 的多个 Partition 分布在多个 Broker 中。

8)消费者组
Kafka 中有一个 Consumer Group(消费组)的概念,多个 Consumer 组团去消费一个 Topic。
同组的 Consumer 有相同的 Group ID。
Consumer Group 机制会保障一条消息只被组内唯一一个 Consumer 消费,不会重复消费。
消费组这种方式可以让多个 Partition 并行消费,大大提高了消息的消费能力,最大并行度为 Topic 的 Partition 数量。

event-stream-topic

例如一个 Topic 有 3 个 Partition,你有 4 个 Consumer 负责这个 Topic,也只会有 Consumer 工作,另一个作为后补队员,当某个 Consumer 故障了,它再补上去,是一种很好的容错机制。

工作流程分析

1)发送数据
Producer在写入数据的时候永远的找leader,不会直接将数据写入follower,消息写入leader后,follower是主动的去leader进行同步的! 发送数据流程

2)保存数据
Kafka将数据保存在磁盘,初始会单独开辟一块磁盘空间,顺序写入数据(效率比随机写入高)。

3)消费数据
Kafka采用的是发布订阅模式,消费者主动的去kafka集群拉取消息,消费者在拉取消息的时候也是找leader去拉取。

多个消费者可以组成一个消费者组(consumer group),每个消费者组都有一个组id!同一个消费组者的消费者可以消费同一topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据!!!我们看下图:

event-stream-topic

所以在实际的应用中,建议消费者组的consumer的数量与partition的数量一致!

4)查找消息
在保存数据的小节里面,我们聊到了partition划分为多组segment,每个segment又包含.log、.index、.timeindex文件,存放的每条message包含offset、消息大小、消息体……我们多次提到segment和offset,查找消息的时候是怎么利用segment+offset配合查找的呢?假如现在需要查找一个offset为368801的message是什么样的过程呢?我们先看看下面的图:

event-stream-topic

这套机制是建立在offset为有序的基础上,利用segment+有序offset+稀疏索引+二分查找+顺序查找等多种手段来高效的查找数据!

核心API

Kafka 有四个核心API,它们分别是

core-API

架构设计分析

Kafka 为何如此之快

Kafka 实现了零拷贝原理来快速移动数据,避免了内核之间的切换。Kafka 可以将数据记录分批发送,从生产者到文件系统(Kafka 主题日志)到消费者,可以端到端的查看这些批次的数据。

批处理能够进行更有效的数据压缩并减少 I/O 延迟,Kafka 采取顺序写入磁盘的方式,避免了随机磁盘寻址的浪费,更多关于磁盘寻址的了解,请参阅 程序员需要了解的硬核知识之磁盘 。

总结一下其实就是四个要点

应用场景

参考

细说 Kafka Partition 分区

学习 Kafka 入门知识看这一篇就够了!

Kafka基本原理详解(超详细!)

真的,关于 Kafka 入门看这一篇就够了