共计 3031 个字符,预计需要花费 8 分钟才能阅读完成。
一、前言
随着技术一直的成熟及市场需求的日益旺盛,实时开发曾经成为以后大数据开发不可或缺的一部分。在整个实时开发的链路中,数据采集须要写入到 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 能够有多个分区,分区的作用是不便拓展,进步并发。
为了便于了解,咱们能够简略的将 Kafka 与快递过程进行类比如下:
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
2、生产形式及调配策略
理论生产数据时 Kafka 中的消费者——Consumer 会以 Consumer Group 的模式与 Topic 交互并调配对应的 Partition。在生产过程中一个 Group 内的数据不反复,但多个 Group 之间的数据可反复生产,这也是公布 - 订阅制的特点。
开发人员能够利用这一特点实现在不影响主业务流程的状况下,对业务数据进行实时监控等。
一个 Group 中蕴含至多有一个 Consumer,一个 Topic 下也至多蕴含一个 Partiton。一个 Consumer Group 中的多个 Consumer 能够并行生产不同的 Partition,以此来进步对 Kafka 数据生产的并行度,从而进步数据处理的速度。然而在生产的过程中,针对于 Partition 和 Consumer 数量的不同,会呈现各种状况,Kafka 针对于不同的状况有相应的调配策略,可参考如下:
四、实时开发如何应用 Kafka
在理论生产中,实时开发也是以一个消费者组或生产者组的形式去 Kafka 中生产相应的数据。
在实时采集工作过程中,采集数据源的数据到 Kafka,通过设置不同的写入并发数,能够设置多个 Producer 向同一个 Topic 下进行数据写入,进步并发度和数据读取效率;同样,当采集 Kafka 数据源时,通过设置不同的读取并发数,能够在一个 Group 内设置多个 Consumer 同时对 Topic 内的数据进行生产。
在实时开发工作中,也能够设置 Kafka 数据源的并行度,从而依据理论业务需要调整并行度来满足生产需要。
五、结语
通过明天的介绍,咱们理解到 Kafka 作为典型“公布 - 订阅”模式的音讯队列如何通过帮忙用户长期存储流式数据,并通过 Consumer Group 和 Partition 的机制实现多并发的读写以进步实时开发相干的效率。后续咱们还会持续介绍跟实时开发相干的内容,敬请期待。
数栈是云原生—站式数据中台 PaaS,咱们在 github 和 gitee 上有一个乏味的开源我的项目:FlinkX,FlinkX 是一个基于 Flink 的批流对立的数据同步工具,既能够采集动态的数据,也能够采集实时变动的数据,是全域、异构、批流一体的数据同步引擎。大家喜爱的话请给咱们点个 star!star!star!
github 开源我的项目:https://github.com/DTStack/fl…
gitee 开源我的项目:https://gitee.com/dtstack_dev…