一文带您快速入门Kafka

作者 | 蔡柱梁
审校 | 重楼目标

  1. 了解 Kafka 的重要概念
  2. 搭建 Kafka 服务端
  3. 使用SpringBoot 实现简单的 Demo
1 了解 Kafka 的重要概念Kafka 是使用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统 。目前 , 它的定位是一个分布式流式处理平台 。
Kafka 在我们工作中最常扮演的三个角色:
  • 消息系统
Kafka 和传统的消息中间件一样具有系统解耦、冗余存储、流量削峰、异步通信等功能 。
  • 存储系统
Kafka 会将消息持久化到磁盘 , 并且有多副本机制 , 有效降低了数据丢失的风险 。有时 , 我们也可以使用它来存储数据 , 只需要把对应的数据保留策略设置成为“永久”即可 。
  • 流式处理平台
Kafka 不仅为很多流式处理框架(如:Storm、Spark、Flink 等)提供了可靠的数据来源 , 还提供了一个完整的流式处理类库 。1.1 基本概念
一文带您快速入门Kafka

文章插图
上图(图出自于《深入理解Kafka核心设计与实践原理》)体现了 Kafka 的整体架构 , Producer 发送消息 , Kafka 将元数据存储在 ZK 中并交由ZK 管理 , Consumer 通过拉模式获取消息 。
  • Producer
生产者 , 消息的投递方 , 负责创建消息并投递到 Kafka 中 。
  • Broker
Kafka 服务实例
  • Consumer
消费者 , 处理消息的一方
上面的概念都是物理层面上的 , 但是在实际使用过程中还有很多逻辑方面的定义 , 这些概念也是需要了解的 。如果不了解 , 就算勉强写出了代码 , 但是自己还是一脸懵不知道自己都定义了什么 , 它们都有什么意义 , 估计离生产故障就不远了 。
接下来我们再去了解三个重要的逻辑概念:
  • Topic(主题)
生产者创建消息是要发送给特定的主题的 , 而消费者拉取消息也是要指定主题的 。消息就是通过主题来归类的 。
  • Partition(分区)
一个Topic 可以有多个 Patition , 而一个 Partition 只属于一个 Topic 。同一个 Topic 下 , 不同 Partition 存储的消息是不同的 。
  • Offset(偏移量)
Kafka 的消息是可以持久化并反复消费的 , 这是因为在每个分区中 , 当有消息写入就会像追加日志那样顺序写入(顺序IO的写入性能是十分好的) , 通过Offset 来记录对应消息所在的位置 。因此 , Offset 是消息在 Partition 中的唯一标识 , 并且能看出同一个 Partition 内的消息的先后顺序 , 我们称之为 “Kafka 保证消息在分区内是有序的” 。
为了更好 , 更直观体现上面三者的关系 , 我们先一起看下图(图出自于《深入理解Kafka核心设计与实践原理》)
一文带您快速入门Kafka

文章插图
该图展示了一个拥有4个 Partition 的 Topic , 而分区里面的阿拉伯数字就是 Offset(也表示着一条消息) , 虚线部分代表新消息可以插入的位置 。每条消息在发送到 Broker 之前 , 会先计算当前消息应该发送到哪个 Partition 。因此 , 只要我们设置合理 , 消息可以均匀地分配在不同的 Partition 上 , 当发现请求数量激增时 , 我们也可以考虑通过适当增加 Partition(Broker 也要增加)的方式 , 从而降低每个 Broker 的 I/O 压力 。
另外 , 为了降低消息丢失的风险 , Kafka 为 Partition 引进了多副本(Replica)机制 , 通过增加副本数量来提高容灾能力 。副本之间采用的是“一主多从”的设计 , 其中 Leader 负责读写请求 , Follower 则仅负责同步 Leader 的消息(这种设计方式 , 大家应该要意识到会存在同步滞后的问题) , 并且副本处于不同的 Broker 中 , 当 Leader 出现故障(一般是因为其所在的 Broker 出现故障导致的)时 , 就从 Follower 中重新选举出新的 Leader 提供服务 。当选出新的 Leader 并恢复服务后 , Consumer 可以通过之前自己保存的 Offset 来继续拉取消息消费 。


推荐阅读