老胡身在南方“鹏城(深圳)”,除写代码啥都不会,全栈技术专家,RocketMQ 多语言client贡献者。技术方面专注中间件,分布式,存储,AI软件领域的解决方案。
场景
数据的时代已经到来,数据的价值越来越重要,面对无处不在的数据,为了把数据利用起来,于是出现了数据中台。
数据中台大致有六大功能:
- 数据收集
- ETL
- 数据计算
- 存储
- 数据分析
- 数据展示
本文讲解RocketMQ在数据中台的数据收集,ETL,数据计算中发挥核心作用
选择
业界已经存在了许多数据同步的解决方案,这些同步解决方案存以两方面为主
- 点对点同步
- 离线同步
而业界大部分同步方案的架构与下图类似:
作为一个工业级的组件不会做选择题。点对点同步要,多对多同步也要。离线同步不可以少,同时实时同步也是必须的。异构与同步数据组件,组件架构如下:
基于消息中间件的异构同步组件与一下优势
多种类型的source
从上图可以观察到,source的类型是很多种的。
gather/sdk:主要是外部数据,比如客户的数据,APP采集数据的来源
RPC: 主要是内部业务系统产生的有价值的数据
agent:收集日志,系统与硬件运行信息
数据源:从各种存储读取数据
削峰填谷
source的读取速度与slink的写入数据都是无法控制的。在普遍情况下source的效率往往是sink的好几倍,可能致使gather服务不可用,造成严重的事故。什么时候出现峰没有人知道,这样不可预知的事情对于整个系统的稳定性与高可用性会造成极大的威胁。于是引入消息中间件作为缓冲区
多数据源异构
客户存在上线与下线两套商品体系,规划两套体系的推荐行为可以共享。需要同时采集客户两套体系的商品数据,同步五个存储。基于消息中间件的异构解决方案,才能非常优雅的处理问题。
更优的资源调配
第一个流程表示的一个source多个sink的架构,第二个流程多个source一个sink的架构。在异构架构设计下source与sink的个数与是否运行都是可以灵活搭配的。这样大大的节约了服务器资源。
深入
在众多消息中间件为什么选择RocketMQ,因为RocketMQ的许多特性帮我们解决许多问题。具体问题如下:
数据安全
在数据同步的组件里面有一个基本原则就是数据不能丢失。对于saas平台这种场景,有非常多的不确定因素与许多不可预知的情况下,数据恢复是一件非常麻烦的事情,如果在实时场景中同步数据与客户内部数据出现差异,可能出现非常致命的事情。对比其他消息中间件,所以数据安全是一件最重要的事情。RocketMQ以下特性在保证数据不丢失
1. RocketMQ的整体架构师设计保证了数据安全。主从同步复制,broker同步落盘
2. 当消费失败之后的消息重试
3. 死信队列:
1)不需要另外维护消息失败后的存储点的
1)异常操作造成队列不存在等异常,可以发送到私信队列
并行消费与同步消费
数据同步分为添加,修改,删除三种行为。表(结果集)可以分类为:追加表与修改表
追加表只有添加行为,适合并行消费
修改表有添加,修改,删除三种行为。在大数据高并发多线程的情况数据中台很容易没有按照业务的数据行为执行,造成数据中台的数据与业务数据不一致性。为了保证执行循序与业务操作循序一致,与选择了RocketMQ的同步消费的特性,用于保证操作执行循序不变
上图演示了并行消费情况下数据不一致的情况。在理想情况下 source的循序是1234,那么sink的执行循序是6785。但是实际执行的循序是5678。于是使用RocketMQ的循序消息特性保证了数据的一致性
顺序消息实际是只让一个消费者消息消息,其他消费者会一直去抢消费权
分类并行
同步消费的效率对比并行消费实在低太多了,而且sink的写入速度远远低于source读取数据,经常造成了大量的数据累积,导致同步数据与业务数据一致性较差,有时低都业务都无法忍受。
在第一次同步时是全量同步,不存在修改操作。所以使用并行同步。之后改为同步消费。为了提高同步消费的性能。经过深入的分析与研究,发现如果对数据进行分类就可以提高效率,于是基于RocketMQ的queue与tag实现了分类并行。
观察与运维能力
目前有大量的同步topic,这些topic创建,删除,测试,定位,观察,查找 是一个难题,项目参与的每个开发,测试,产品等都要去观察与运维topic。RocketMQ-console能简单的帮我们解决这些问题,很大程度上提高了整体开发效率与进度
基于消息轨迹,初步实现数据跟踪
上面是推荐业务场景下,数据在系统内部的流转说明图。这样一个流转,在内部称为“任务”,每个节点是“算子”。某条数据可能因为某个不可抗拒的因素没有产生“任务”的预期结果。在复杂的任务与系统,高并发,高性能的情况下,需要对数据的流转进行监控,及时发现流转的异常,快速的修正数据与问题。于是需要一个能力:数据跟踪
通过观察发现目前所有的算子大部分都从RocketMQ读取数据,于是将计就计基于RocketMQ的消息轨迹,设计完成了第一代数据跟踪能力
RocketMQ-connect
RocketMQ-connect是基于RocketMQ实现的数据异构开源组件,已经支持多种数据源之间的同步。现在越来越多的企业与公司使用RocketMQ支撑起业务平台与数据平台,在各平台的数据是一种流状态。使用RocketMQ-connect在原有的架构下可以简单,快速的构建起一套流数据平台。
RocketMQ-connect架构有两个明显的特征:
1. 去中心化设计与无依赖架构设计
2. 基于SPI的可插排的设计
去中心化设计
connect-cli把异构任务发送到任何一个connect-runtime,runtime把任务信息做了简单处理发送broker。集群内所有connect-runtime都会接受到任务,然后存储到本地,runtime启动运行任务不用直接依赖broker。
在整体的RocketMQ-connect在整体架构设计上没有使用任何的其他组件,保证了整体的简洁与优雅
基于SPI的可插排的设计
json { "connector-class":"org.apache.rocketmq.connect.file.FileSourceConnector", "topic":"fileTopic", "filename":"/opt/source-file/source-file.txt", "source-record-converter":"org.apache.rocketmq.connect.runtime.converter.JsonConverter" }
connector-class: source的执行对象
source-record-converter: 数据处理对象
topic:file-source的配置
filename: file-source的配置
从任务信息中可以看出,启动一个任务需要提供任务所需的source或则sink执行类。RocketMQ-connect会在插件目录下找寻启动类。