博客 数栈产品分享:Kafka— 实时离不开的那个 TA

数栈产品分享:Kafka— 实时离不开的那个 TA

   小美   发表于 2023-01-31 16:25  204  0

一、前言

随着技术不断的成熟及市场需求的日益旺盛,实时开发已经成为当前大数据开发不可或缺的一部分。在整个实时开发的链路中,数据采集需要写入到 Kafka,数据处理也需要使用到 Kafka。今天我们就针对 Kafka 这个时下主流的消息中间件进行简单的介绍。

二、消息队列:数据流的归宿

在实时开发的场景中,来源于各类行为、事件的数据是随着发生时间源源不断如同河流一般进入实时任务并不断产出结果的。传统的异构数据源,数据以结构化的形式存储在对应的库表内。那么除了数据本身包含的业务时间属性,要如何找到一个稳定的时间维度来描述这些数据的先后呢?又要将流式的数据放在哪里去进行处理?

消息队列就是为了应对大量数据需要传递、分析场景所涉及的。

目前消息队列的方式分为以下两种:

  • 点对点(point to point,queue):消息被任一消费者消费后即消失在点对点系统中,消息被保留在队列中,一个或多个消费者可以消耗队列中的消息,但是特定消息只能由最多一个消费者消费,一旦消费者读取队列中的消息,它就从该队列中消失。
  • 发布 - 订阅(publish/subscribe,topic):消息可被所有订阅者(组)消费在发布 - 订阅系统中,消息生产者称为发布者,消息消费者称为订阅者。发布者发布的消息被保留在 Topic 中,与点对点系统不同,消费组可以订阅一个或多个主题并使用该主题中的所有消息,同样,所有发布到 Topic 的消息均可被所有订阅组消费。一个订阅组内可能包含多个订阅者。

为了更好的理解消息队列的运作方式,我们先设想如下一个场景:数据是一份快递,数据在不同开发环节之间的流转就是快递的配送过程。

1、电视购物:上门配送,客户签收

在 10 年前电视购物还比较盛行的时代,多数货物是通过邮政等快递公司进行上门配送,往往快递员上门后,会让客户在运单上签字验收。这时候的快递员,只有每一份快递被客户签字验收后,才会再开始下一件货品的运输(此为极端情况下的举例)。

当一个客户存在多个快递,并且多个快递是陆续到达的时候,就会出现快递员配送 - 等待签收 - 客户签收 - 快递员回到收发点发现新的快递 - 快递员配送这样一个反复链路,如果存在客户反应慢,签字速度慢的情况,则会花费更多时间。

同样,在传统的数据开发场景中,数据传输也遵循这样的规律。上下游的两个服务之间对数据进行传输等同于快递配送的过程,如果一次数据传输需要等到下游服务给到的回执来保证数据正常写入,再开始下一次的进行,那么下游服务处理速度及响应速度会严重影响这一环节的数据从而导致数据延迟;如果整条数据传输的链路包含了多个这样的进程,整体数据的时效性就无法得到保证。

2、快递物流:统一快递站

随着网络购物的不断发展,为了提高效率,现在的货物配送方式发生了极大的改变。现在快递员从收发点拣货出发,将快递配送至相应地区的快递站,由快递站替实际用户进行一次代理签收,此时视作快递配送的过程已经完成。快递员就可以快速回到拣货点,后续快递站会以各类形式通知到具体的用户,有相应的快递需要签收,在 “某某时间点” 前来到快递点拿取。对于用户而言,它只需要持续关注快递站的状态(订阅),当有快递时,及时去取就可以。

当我们熟悉了快递从仓库中存储到配送到收件人手中的流转过程时,我们就能够理解消息中间件是如何在实时开发的过程中运作的。那么在多种消息中间件中,目前应用最广泛的就属 Apache Kafka。

三、Kafka:消息中间件

Apache Kafka 是一个分布式、支持分区的(partition)、多副本的(replica),基于 zookeeper 协调的分布式消息系统,用于实时处理大量数据,常用于大数据,数据挖掘等场景。

Kafka 中经常会涉及到如下基本概念:

  • Zookeeper:用于将独立的 Broker 配置成 Kafka 集群;
  • Broker:Kafka 集群包含一个或多个服务器,这种服务器被称为 Broker;
  • Topic:Kafka 中的消息主题,类似于 Table 的概念,用于区分不同消息;
  • Partition:Topic 分区,每个 topic 可以有多个分区,分区的作用是方便拓展,提高并发。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user6/article/ff6e4bc82791b62f4608d8f60154b8df..png

为了便于理解,我们可以简单的将 Kafka 与快递过程进行类比如下:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user6/article/18f61ef12fe5a209212c275b333a4c74..png

1、数据写入

1)确定 Topic 及 Partition

一个 Topic 下可能存在多个 Partition,在向 Kafka 写入数据时需要先确定 Topic 及对应的 Partition。

2)找到 Partition 通信地址

由于 Kafka 实现了高可用,确定写入 Partition 后,Producer 会从 ZK 中获取到对应 Partition 的 Leader 并与其通信。

3)数据传输

  • Leader 接收到 Producer 的信息并写入本地 Log
  • 其他 Follower 从 Leader Pull 信息,并写入本地 log,完成后向 Leader 发送 ACK
  • Leader 接收到所有 Follower 信息,并设置一个 HW(High Watermark),然后向 Producer 发送 ACK

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user6/article/b231d31f3dd3027819655e9cbecf1fd7..png

2、消费方式及分配策略

实际消费数据时 Kafka 中的消费者 ——Consumer 会以 Consumer Group 的形式与 Topic 交互并分配对应的 Partition。在消费过程中一个 Group 内的数据不重复,但多个 Group 之间的数据可重复消费,这也是发布 - 订阅制的特点。

开发人员可以利用这一特点实现在不影响主业务流程的情况下,对业务数据进行实时监控等。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user6/article/49ed3679e3aaac7d2a9ffd157b999f71..png

一个 Group 中包含至少有一个 Consumer,一个 Topic 下也至少包含一个 Partiton。一个 Consumer Group 中的多个 Consumer 可以并行消费不同的 Partition,以此来提高对 Kafka 数据消费的并行度,从而提高数据处理的速度。但是在消费的过程中,针对于 Partition 和 Consumer 数量的不同,会出现各种情况,Kafka 针对于不同的情况有相应的分配策略,可参考如下:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user6/article/12703e1f2aeb676250064bbb3034f7d1..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user6/article/f474093f32e7d4e70836bf28a8db4065..png

四、实时开发如何使用 Kafka

在实际生产中,实时开发也是以一个消费者组或生产者组的方式去 Kafka 中消费相应的数据。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user6/article/5a210000ec89ccf4983992afef49f5ca..png

在实时采集任务过程中,采集数据源的数据到 Kafka,通过设置不同的写入并发数,可以设置多个 Producer 向同一个 Topic 下进行数据写入,提高并发度和数据读取效率;同样,当采集 Kafka 数据源时,通过设置不同的读取并发数,可以在一个 Group 内设置多个 Consumer 同时对 Topic 内的数据进行消费。

在实时开发任务中,也可以设置 Kafka 数据源的并行度,从而根据实际业务需求调整并行度来满足消费需求。

五、结语

通过今天的介绍,我们了解到 Kafka 作为典型 “发布 - 订阅” 形式的消息队列如何通过帮助用户临时存储流式数据,并通过 Consumer Group 和 Partition 的机制实现多并发的读写以提高实时开发相关的效率。后续我们还会继续介绍跟实时开发相关的内容,敬请期待。

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群