Kafka|Introduction

References

Kafka 中文翻译

java - The input line is too long when starting kafka - Stack Overflow

基本功能&概念

提供的功能

Kafka作为流事件处理平台,其提供了强大的事件处理功能:

  • 发布和订阅事件流,以及从其他的系统平台持续导入和导出数据
  • 存储事件流
  • 针对当前发生和已经发生的事件流进行回顾和处理

组成架构

Kafka可以部署在集群或者是单机节点,主要包括客户端和服务端

服务端

负责存储和传输事件流,也分为两种节点:

  • 存储节点,又叫做 Broker,存储事件流
  • 剩下的节点运行 Kafka Connect 对接外部数据进行事件流处理过程中的导入和导出

客户端

客户端帮助编写可以处理大量数据的应用程序和微服务

Java/Scala 提供了直接的客户端和更高级别的 Stream API库

同时也可以用 REST API 作为客户端来调用

术语概念

事件 Event

Kafka 中一个事件(Event)的基本组成如下:

1
2
3
Event key: "Alice"
Event value: "Made a payment of $200 to Bob"
Event timestamp: "Jun. 25, 2020 at 2:06 p.m."

除了基本的 KV 之外还要包含时间戳信息以及可选的元数据标头

发布订阅&生产者消费者

在 Kafka 中,生产者是发布事件的客户端(写入),消费者是订阅事件的客户端(读取和处理)

生产者和消费者互相解耦并且互相透明,不知道对方的存在

这也是实现异步解耦以及事件驱动架构的核心,无论是生产者还是消费者都不需要等待对方,就可以进行自己对应的操作

主题Topic

主题 Topic 是事件 Event 的集合,一个 Topic 可以有0个1个或者多个的订阅者以及0个1个或者多个的发布者

此外不同于传统的消息队列,Kafka中事件被消费之后不会删除,我们可以针对每一个 Topic 来设置事件的过期时间,因此可以实现事件的回查

分区Partition

主题是分区的,这也是构建分布式系统可靠性、可扩展性的一个经典思想

通过将一个 Topic 分成多个 Partition,Kafka 实现了水平扩展(Scalability)。多个 Partition 可以分布在不同的 Broker 节点上,从而提高并行处理能力

也就是说一个大的 Topic 在逻辑上分为多个 Partition,同时这些 Partition 在逻辑上包含多个 Eevnts,每一个 Partition 会存在 Replicatioin,Replication 会存在于多个 Broker 节点上,这是实现分布式系统中高可用需求的最常见的一种方式

具体的 Partition Bucket 分配逻辑其实是基于事件 Event 的 key 来分配,事件在发布的时候会附上一个 offset 来表示在 Partition Bucket 中的具体位置

Event|Topic|Partition

同时 Kafka 保证给定分区的任何消费者,将始终按照与写入事件一致的顺序来消费事件

总结:

  • 分区:可扩展性,并发请求
  • 副本:高可用

部署实践

本地部署

Kafka 的部署需要 ZooKeeper 的依赖,好在最新版本已经内置了 Zookeeper 的启动方式,一行命令即可

官网下载的 release 包含 .sh 的 Linux 部署方式以及在 \bin\windows.bat 部署方式,结合实际生产环境和测试环境来部署即可

1
.\zookeeper-server-start.bat ..\..\config\zookeeper.properties

在启动 bat 脚本的时候报错:The input line is too long. The syntax of the command is incorrect. 这是因为官方给的下载包解压出来之后是类似 kafka_2.11-1.0.0 这样的目录,重命名为 kafka 即可解决问题

启动 Zookeeper 之后启动 Kafka Server

1
.\kafka-server-start.bat ..\..\config\server.properties

Docker部署

部署 Kafka 单机节点

1
2
$ docker pull apache/kafka:3.7.0
$ docker run -p 9092:9092 apache/kafka:3.7.0

实践测试

创建 Topic

在我们之前的基本概念中提到了,Kafka 作为一个事件流处理的平台,其所定义的事件主要包含:付款交易、手机的地理位置更新、发货订单、传感器测量 来自物联网设备或医疗设备的消息

而这些事件都被存储和维护在一个 主题 Topic 中,事件类似于文件而主题类似文件夹

我们通过官方提供的命令行工具来作为客户端

1
2
.\kafka-topics.bat --create --topic quickstart-events --bootstrap-server localhost:9092
Created topic quickstart-events.

这一段命令向 Kafka 服务端发送创建新 Topic 的请求,其中 --topic 指定了主题名称,--bootstrap-server 指定了服务端地址

我们还可以查询主题的详细分区信息,可以看到一些分区个数,复制因子等

具体参数设置可以 --help 一下

发布和订阅事件

客户端发布的事件会被 Broker 持久化存储

通过控制台命令启动交互式的客户端来发布记录,默认每一行都是一个 Event 记录

同时我们打开消费者进程,可以看到事件几乎是同时被消费的:

发布

订阅

同时正如之前所说,即使我们重新启动一个新的订阅者进程,之前发布的事件也能被按顺序读取出来(发布的顺序),不同于传统的消息队列,Kafka采取的是持久化存储


Kafka|Introduction
http://example.com/2024/05/28/Kafka-Introduction/
作者
Noctis64
发布于
2024年5月28日
许可协议