kafka详解(一)--kafka是什么及怎么用
kafka是什么
在回答这个问题之前,我们需要先了解另一个东西--event streaming。
什么是event streaming
我觉得,event streaming 是一个动态的概念,它描述了一个个 event ( "something happened" in the world ) 在不同主体间连续地、正确地流动的状态。(这里我想搞个动图的,不过 plantuml 不支持,所以只能靠想象了。。)
event source 产生 event,event source 可以是数据库、传感器、移动设备、应用程序,等等。
event broker 持久化 event,以备 event sink 可以随时获取它们。
event sink 实时或回顾性地从 broker 中获取 event 进行处理。
有的人可能会问,为什么需要 broker,event 从 source 直接流到 sink 不行吗?当然可以,但是不够解耦,要么 event source 需要事先知道谁需要这些 event,要么 event sink 需要知道 event 从哪里来。
现在,我们可以在脑子里想象出 event streaming 的样子:event 由 source 产生,然后流向 broker,在 broker 被持久化,再流到 sink。并不复杂对吧?
event streaming用来干嘛
我们可以在很多的应用场景中找到 event streaming 的身影,例如:
实时处理支付、金融交易、客户订单等等;
实时跟踪和监控物流进度;
持续捕获和分析来自物联网设备或其他设备的传感器数据;
不同数据源的数据连接;
作为数据平台、事件驱动架构和微服务等的技术基础;
等等。
kafka是什么
现在我们回过头来回答问题:kafka 是什么?
我认为,如果说 event streaming 是一种规范的话,那么 kafka 就是 event streaming 的一种具体实现。
kafka的架构
概念视图
从上层的抽象看,kafka 由三个部分组成:
其中,producer 发布 event,broker 持久化 even,consumer 订阅 event。其中,producer 和 consumer 完全解耦,互不知晓。
不过,这是概念视图,不是物理视图。具体实现会因为 source 或 sink 的不同而有所不同。
物理视图
Producer/Consumer API
当 event source 为普通应用程序时,可以在程序中引入 Producer API 和 Consumer API 来完成与 broker 的交互。这些 API 涵盖了大部分主流语言,例如 Java、Scala、Go、Python、C/C++,除此之外,我们也可以直接使用 REST API 调用。
Connector
但是,并不是所有 source 或 sink 都能使用 API 的方式,例如,实时捕获数据库的更改、文件的更改,从 RabbitMQ 导入导出消息,等等。
这个时候就需要使用 connector 来完成集成。通常情况下,connector 并不需要我们自己开发,kafka 社区为我们提供了大量的 connector 来满足我们的使用需求。
topic&partition
接下来我们再来补充下 broker 的一些细节。//zzs001
通常情况下,我们的 broker 会接收到很多不同类型的 event ,broker 需要区分它们,以便正确地路由。topic 就发挥了作用,它有点类似文件系统的目录,而 event 就类似于目录里的文件,sink 想要什么 event,只要找到对应的 topic 就行了。
同一 topic 可以有零个或多个 producer 和 consumer,不同于传统 MQ,kafka 的 event 消费后并不删除,为什么这么做呢?这个我们后续的博客会说的。
除此之外,一个 topic 会划分成一个或多个 partition,这些 partition 一般分布在不同的 broker 实例。producer 发布的 event 会根据某种策略分配到不同的 partition,这样做的好处是,consumer 可以同时从多台 broker 读取 event,从而大大提高吞吐量。另外,为了高可用,同一个 partition 还会有多个副本,它们分布在不同的 broker 实例。
需要注意一下,当同一 topic 的 event 被分发到多个 partition 时,写入和读取的顺序就不能保证了,对于需要严格控制顺序的 topic,partition 需要设置为 1。
Streams
kafka 那么受欢迎,还有一个很重要的原因,就是它提供了流式处理类库,支持对存储于Kafka内的数据进行流式处理和分析。这部分内容,我也是刚入门而已,后续博客再好好研究。
如何使用kafka
环境说明
kafka:3.2.1
os:CentOS Linux release 8.3.2011
JDK:1.8.0_291
注意,kafka 3.2.1 要求本地环境安装 Java 8 及以上版本
下载安装
从 下载页面下载安装包。
解压安装包。
tar -xzf kafka_2.13-3.2.1.tgz
相关文章