Kafka【入门】

Kafka简介

Apache Kafka发源于LinkedIn,于2011年成为Apache的孵化项目,随后于2012年成为Apache的主要项目之一。Kafka使用Scala和Java进行编写。Apache Kafka是一个快速、可扩展的、高吞吐、可容错的分布式发布订阅消息系统。Kafka具有高吞吐量、内置分区、支持数据副本和容错的特性,适合在大规模消息处理场景中使用。

消息系统发展历史

1.初见曙光 消息中间件其实诞生的很早,在互联网应用还是一片荒芜的年代,有个在美国的印度哥们Vivek Ranadive就设想了一种通用软件总线,采用发布订阅的模式,像主板上的总线一样供其他相应程序接入。他创办了一家公司Teknekron,实现了世界上第一个消息中间件The Information Bus(TIB)

2.各自为战 TIB受到了企业的欢迎,Teknekron的业务发展引起了当时最牛气的IT公司IBM的注意,于是他们也开始研发了自己消息队列软件,于是才有了后来的wesphere mq,微软也陆续加入了战团。由于商业壁垒,商业MQ供应商想要解决应用互通的问题,而不是去创建标准来实现不同MQ产品间的互通,或者允许应用程序更改MQ平台

3.劫制天下 为了打破这个壁垒,同时为了能够让消息在各个消息队列平台间互融互通, JMS (Java Message Service) 应运而生 。JMS 试图通过提供公共 Java API 的方式,隐藏单独 MQ 产品供应 商提供的实际接口,从而跨越了壁垒,以及解决了互通问题。从技术上讲, Java 应用程序只需 针对 JMS API 编程,选择合适的 MQ 驱动即可, JMS 会打理好其他部分 。ActiveMQ 就是 JMS 的 一种实现 。不过尝试使用单独标准化接口来胶合众多不同的接口,最终会暴露出问题,使得 应用程序变得更加脆弱 。所以急需一种新的消息通信标准化方案 。

4.一统江湖 4.在 2006 年 6 月,由 Cisco 、 Redhat 、iMatix 等联合制定了 AMQP 的公开标准,由此 AMQP 登上了历史的舞台 。它是应用层协议的一个开放标准,以解决众多消息中间件的需求和拓扑结 构问题 。它为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受 产品、开发语言等条件的限制 。

5.合久必分 LinkedIn在实现消息队列的时候觉得AMQP规范并不适合自己,所以Kafka并不支持AMQP协议。RocketMQ在实现上借鉴了Kakfa的思想,所以也不支持AMQP协议,并且你会发现在Kafka和RocketMQ中都有类似Topic和Consumer Group的概念,而这些概念在AMQP协议中是不存在的

Kafka概念
  1. 概念一: 生产者与消费者

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLfYGecR-1655360272829)(https://pic3.zhimg.com/80/v2-832229b59a1651eca789c1ce7988c252_720w.jpg)]

    对于 Kafka 来说客户端有两种基本类型:生产者(Producer)消费者(Consumer)。除此之外,还有用来做数据集成的 Kafka Connect API 和流式处理的 Kafka Streams 等高阶客户端,但这些高阶客户端底层仍然是生产者和消费者API,它们只不过是在上层做了封装。

    这很容易理解,生产者(也称为发布者)创建消息,而消费者(也称为订阅者)负责消费or读取消息。

  2. 概念二: 主题(Topic)与分区(Partition)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBQNVbz2-1655360272831)(https://pic3.zhimg.com/80/v2-ba46359183324eb5d10f70d00736a4ce_720w.jpg)]

    在Kafka中,消息以主题作为分类的标准,既避免了所有的消息塞到一个中心的问题,也方便了消费者根据自己的“喜好”来消费消息。

    另外,对于同一个消息:例如:用户中奖的通知类消息,因为对于大型的项目数据流是庞大的,所有如果将所有的中奖用户都通过一个通道取发送消息的话,也许(第一个收到的人都已经兑奖完毕了,最后的人还没有接受到消息)。所以,又引入了分区的概念(Partition

    1. 概念三: Broker 和集群(Cluster)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CQT1NOJO-1655360272832)(https://pic2.zhimg.com/80/v2-9c8de1bed82a54799c4ef2cbfeedab61_720w.jpg)]

    简单来说:单体的Kafka即为Broker, 多个broker组成了Cluster 。

    Cluster中存在集群控制器(leader), 当管理机器宕机时,注册中心会协调集群重新选举,产生新的Leader。

    Kafka 的一个关键性质是日志保留(retention),我们可以配置主题的消息保留策略,譬如只保留一段时间的日志或者只保留特定大小的日志。当超过这些限制时,老的消息会被删除。我们也可以针对某个主题单独设置消息过期策略,这样对于不同应用可以实现个性化。

Kafka底层实现原理

首先要明确一点:Kafka的存在是基于文件系统的。

虽然在我们的认知中文件系统的应该是“缓慢的”存在,但是实际上现代的操作系统针对磁盘的读写已经做了一些优化方案来加快磁盘的访问速度。比如,预读会提前将一个比较大的磁盘快读入内存。后写会将很多小的逻辑写操作合并起来组合成一个大的物理写操作。并且,操作系统还会将主内存剩余的所有空闲内存空间都用作磁盘缓存,所有的磁盘读写操作都会经过统一的磁盘缓存(除了直接 I/O 会绕过磁盘缓存)。综合这几点优化特点,如果是针对磁盘的顺序访问,某些情况下它可能比随机的内存访问都要快,甚至可以和网络的速度相差无几。

在基础概念之中讲述了Topic的意义和地位,他在逻辑上面对的消费者和生产者。在实际的物理存储之中,我有又可以将Topic进行以新的方式去看待,那就是Partition;

每一个 Partition 最终对应一个目录,里面存储所有的消息和索引文件。默认情况下,每一个 Topic 在创建时如果不指定 Partition 数量时只会创建 1 个 Partition。比如,我创建了一个 Topic 名字为 test ,没有指定 Partition 的数量,那么会默认创建一个 test-0 的文件夹,这里的命名规则是:<topic_name>-<partition_id>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iVVgcu7v-1655360272832)(https://pic4.zhimg.com/v2-346cb3219087ad26746e18f410954d9f_r.jpg)]

任何发布到 Partition 的消息都会被追加到 Partition 数据文件的尾部,这样的顺序写磁盘操作让 Kafka 的效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是 Kafka 高吞吐率的一个很重要的保证)。

每一条消息被发送到 Broker 中,会根据 Partition 规则选择被存储到哪一个 Partition。如果 Partition 规则设置的合理,所有消息可以均匀分布到不同的 Partition中。

在 Kafka 的文件存储中,同一个 Topic 下有多个不同的 Partition,每个 Partition 都为一个目录,而每一个目录又被平均分配成多个大小相等的 Segment File 中,Segment File 又由 index file 和 data file 组成,他们总是成对出现,后缀 “.index” 和 “.log” 分表表示 Segment 索引文件和数据文件。

现在假设我们设置每个 Segment 大小为 500 MB,并启动生产者向 topic1 中写入大量数据,topic1-0 文件夹中就会产生类似如下的一些文件:

    | --topic1-0
        | --00000000000000000000.index
        | --00000000000000000000.log
        | --00000000000000368769.index
        | --00000000000000368769.log
        | --00000000000000737337.index
        | --00000000000000737337.log
        | --00000000000001105814.index
        | --00000000000001105814.log
    | --topic2-0
    | --topic2-1

**egment 是 Kafka 文件存储的最小单位。**Segment 文件命名规则:Partition 全局的第一个 Segment 从 0 开始,后续每个 Segment 文件名为上一个 Segment 文件最后一条消息的 offset 值。数值最大为 64 位 long 大小,19 位数字字符长度,没有数字用0填充。如 00000000000000368769.index 和 00000000000000368769.log。

例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Qd7SoTs-1655360272832)(https://pic4.zhimg.com/v2-fbd72266fb39101145c204d6e38f7f6b_r.jpg)]

其中以索引文件中元数据 ❤️, 497> 为例,依次在数据文件中表示第 3 个 message(在全局 Partition 表示第 368769 + 3 = 368772 个 message)以及该消息的物理偏移地址为 497。

注意该 index 文件并不是从0开始,也不是每次递增1的,这是因为 Kafka 采取稀疏索引存储的方式,每隔一定字节的数据建立一条索引,它减少了索引文件大小,使得能够把 index 映射到内存,降低了查询时的磁盘 IO 开销,同时也并没有给查询带来太多的时间消耗。

因为其文件名为上一个 Segment 最后一条消息的 offset ,所以当需要查找一个指定 offset 的 message 时,通过在所有 segment 的文件名中进行二分查找就能找到它归属的 segment ,再在其 index 文件中找到其对应到文件上的物理位置,就能拿出该 message 。

由于消息在 Partition 的 Segment 数据文件中是顺序读写的,且消息消费后不会删除(删除策略是针对过期的 Segment 文件),这种顺序磁盘 IO 存储设计师 Kafka 高性能很重要的原因。

Kafka 是如何准确的知道 message 的偏移的呢?这是因为在 Kafka 定义了标准的数据存储结构,在 Partition 中的每一条 message 都包含了以下三个属性:
offset:表示 message 在当前 Partition 中的偏移量,是一个逻辑上的值,唯一确定了 Partition 中的一条 message,可以简单的认为是一个 id;
MessageSize:表示 message 内容 data 的大小;
data:message 的具体内容.

Windows本地动手搭建Kafka
一.下载

https://kafka.apache.org/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmFpPyWw-1655360272833)(https://pic4.zhimg.com/80/v2-cf6301c12a9ed1540a99ac14a3bd0a93_720w.jpg)]

选择下载任意版本的压缩包(注意不要下载src资源包),

下载到本地后,将文件解压到 D:\kafka_2.11-2.4.0,该文件夹包括了所有相关的运行文件及配置文件,其子文件夹bin\windows 下放的是在Windows系统启动zookeeper和kafka的可执行文件,子文件夹config下放的是zookeeper和kafka的配置文件。

二.本地启动ZK和kafka

它们都需要进入 D:\kafka_2.11-2.4.0 目录,然后再启动相应的命令。

启动zookeeper服务,运行命令:

bin\windows\zookeeper-server-start.bat config\zookeeper.properties

启动kafka服务,运行命令:

bin\windows\kafka-server-start.bat config\server.properties
三.创建Topic

Kafka中创建一个Topic,名称为test-kafka

bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test-kafka

其中包含了partiton的分区数量:可以手动自己设置

创建成功后,可以使用如下命令,显示所有Topic的列表:

bin\windows\kafka-topics.bat --list --zookeeper localhost:2181 

启动生产者(需要输入对应Topic):

bin\kafka-console-producer.bat --broker-list localhost:9092 --topic test-kafka

启动消费者可以实时获取数据:

bin\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic kafka-test-topic --from-beginning
Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐