当前位置: 首页 > news >正文

电商 SaaS 全渠道实时数据中台最佳实践

摘要:本文整理自聚水潭数据专家张成玉,聚水潭高级数据工程师应圣楚,在 FFA 2022 行业案例专场的分享。本篇内容主要分为四个部分:

  1. 实时数仓的建设和发展

  2. 数据中台的产品体系及架构

  3. 实时计算的实践和优化

  4. 对实时计算的未来展望

Tips:点击「阅读原文」查看原文视频&演讲 ppt

ecd7d5bd3c2ed93e40094a1b8f89104a.jpeg

聚水潭是一家做电商 ERP 的公司,ERP 主要由四个模块组成,OMS、WMS、SCM、DRM,其中 OMS 是订单管理系统。从 2014 年发展至今,聚水潭已经对接了 300+线上平台渠道,客户通过我们的 ERP 产品可以统一做订单的管理,避免了需要去各个线上平台单独处理,全渠道也是由此而来。基于 ERP 的底座,我们的数据团队打造了为商家服务的实时数据中台,目前已经有两万+商家付费订阅。

01

实时数仓的建设和发展

247e9f33def8b86ae5e5f8499085d449.jpeg

聚水潭发展至今大概经历了四个阶段。

第一阶段,为了满足商家报表的看数需求,提供了 SqlServer 的在线查询。但它有一些弊端:

  • 无法提供丰富统计指标;

  • 业务库耦合,RT 不稳定,商家体验差。

  • 分库分表很难全局聚合统计,影响运营分析。

第二阶段,通过 AnalyticDB、多集群 ETL 做 T+1 的离线分析,补足 SqlServer AP 能力的不足。

第三阶段,通过 Flink+MC 实现实时/离线 Lambda 架构的双链路,MC 补齐了模型、调度、跨集群统计的短板。计算引擎实现了秒级更新,支持业务高时效的统计需求。

第四阶段,实时数仓 1.0 落地,通过 Flink 实时模型规范、数仓分层落地,包括自建 DB 提供实时维表和外置状态存储,用 Hologres/PolarDB 作为 ADS 层存储,提供不同场景高效查询。

796f64665262b12653d5ff9f1bbdfb94.jpeg

上图是我们实时数仓的架构。我们大多数的数据都在 SqlServer 的业务库,然后通过我们自研的同步中间件,同步数据到 Kafka 或者 SLS 里,作为 Flink 的 ODS 层。接着通过 Flink 清洗到 DWD 层,DWD 层和我们自建 DB 做了很多维表关联,包括外置状态交互。接着通过 Flink 做 ADS 层的聚合运算,ADS 的结果根据不同的业务场景落到不同的存储引擎里。

目前在聚水潭主要分为两个模块。第一个是在线服务,它目前支撑我们的实时数据门户、实时大屏的业务场景,主要由 PolarDB 和 Redis 承接。第二个是 AD-HOC 分析,它目前支撑实时物流场景,主要由 Hologres 和 AnalyticDB 承接。

02

数据中台的产品体系及架构

聚水潭的数据中台主要为商家服务,基于商家的看数场景,我们抽象了三个核心要素,分别是角色、数据、场景。简而言之,就是什么样的人,在什么样的场景,看什么样的数据。

下面通过两个场景,带大家感受一下,为什么我们要通过实时计算的方式来满足商家高时效的看数需求。

639987cd05df45cb3ce4584e0f4b6f91.jpeg

场景 1:在线交易实时多维分析。商家运营人员经常要面对在线交易实时多维分析的场景。最开始我们通过在线库提供简单的支持,但在线库有大商家 RT 响应慢,多表关联性能差,AP 查询性能差的问题。所以我们基于实时计算,在中间层做多表关联,在应用层实时聚合,将数据量级降低。通过 KV 做快速查询,来满足商家高时效的快速场景。

5c3ffadbbe56af57b634c6d338b05a5f.jpeg

场景 2:仓管发货实时跟踪。我们的商家很多都有自己的仓库或者三方仓库,对于仓库内的仓管,他们需要对每天的发货情况做实时跟踪。最开始我们通过离线计算的方式产出 T+1 的数据,但这就会导致今日发货进度无法感知,发货不及时产生资损,所以商家有很强烈的实时看数需求。我们通过实时计算保证数据的秒击产出,且我们提供了多个仓库发货进度的实时统计,仓管可以基于我们的实时分析数据来做实时驱动,调配发货。

d8e9d5bc0dc23fc686916016c1d57b10.jpeg

上图是我们实时数据中台的完整架构图。目前最底层的数据源已经对接了 300+平台,100+物流公司,通过实时计算的分层来支撑多业务场景、多主题的数据分析。目前我们的实时场景可以分为两部分,实时场景分析和实时风控监控。

实时场景分析可以分全渠道今日销量统计、多平台多店铺汇总统计、重点商品多维统计、多平台直播分析、售后类型实时分析、发货进度实时跟踪。

实时风控监控目前做的比较多的是物流实时预警,未来将要做的库存实时监控、价格实时预警。

a08fb2cf74d5f76cc2210d512bebcdb2.jpeg

商家的业务同学可以大致分为运营同学、售后同学、直播同学、仓库同学。他们在我们的实时门户里都能找到自己对应的业务场景,满足他们实时看数的需求。大致我们分为了以下六个板块。

1. 多平台多店铺汇总指标,实时趋势历史对比。

2. 重点店铺核心渠道置顶,新店铺新渠道孵化。

3. 主推款式重点商品关注,新款新品销售跟踪。

4. 发货进度及未发货情况,关键节点超时风险。

5. 主播带货支持跨天统计,头部主播直播爆品。

6. 售后订单退货金额统计,售后单据原因跟踪。

以上板块可以满足不同的业务同学,其中“多平台多店铺汇总指标、重点店铺核心渠道置顶、主推款式重点商品关注”可以帮助运营同学快速响应。“发货进度即及发货情况”可以帮助仓库同学做发货的实时跟踪。“主播带货支持跨天统计”可以帮助主播做跨店统计。“售后订单退货金额统计”可以帮助售后同学做售后订单的实时跟踪。

76e1dc7e60037851ef00aa74ecf2c045.jpeg

我们的全渠道实时数据大屏主要满足商家平时或者大促阶段的投放诉求。不但涵盖了实时数据中台的大部分模块,又做了销量热力地图,让分布一目了然。

03

实时计算的实践和优化

我们把 Flink 的一些难题归纳为以下三类。

1. 流关联。这里特指多事实流状态关联,关联周期长。

2. 大状态管理。它可能会有 TB 级的状态,甚至更大,且它的 TTL 可能会超过一个月。

3. 高时效体验。包括稳定性、任务延迟的概念。

c1084476ee513c3beae338cc63660d94.jpeg

举个例子,商品分摊、拆分是 Flink 的一个任务,它属于数仓的公共层。这个任务背景是客户想要看到商品粒度金额、件数、成本价等等信息。对于这样的需求,我们把整个流程拆成三步。

1. 三流关联。三流分别是订单流、订单明细流、操作日志流。订单流里是支付时间等基本的订单信息;明细流里是商品粒度的成本价等信息;操作日志流会记录一些删除的信息、update、更改其他字段的信息。关联之后的数据,我们再根据业务逻辑做商品分摊。

2. 商品分摊。这一步我们会把订单上的金额,分摊到具体的每个商品上。这样我们就可以得到商品的金额和件数了。

3. 组合装拆分。它有个特殊的业务场景,商家会把不同的商品打包成另外的商品来卖。比如 a 和 b 商品,会打包成 c。如果发生 c 的订单,需要拆分成 a 和 b 做统计,具体去看它的成本价和销售金额。

5336c8c8aa2a632e2705980b71db4402.jpeg

在上面的场景中,有一个多事实流关联的问题。最初我们是用 Join 来解决的,也就是把三条流分为两次 Join 去解决,但任务效率不太理想,状态也较大。之后我们参考了一些行业案例,并了解到 UNION ALL+KEY BY 是关联键一致的,所以后来我们用 UNION ALL+KEY BY 替代了多次 Join。这个方案的原理是我们可以复用它的状态,即 UNION ALL+KEY BY 每条流的状态只保留一份,而 Join 保留多份。

另外,多事实流关联还有一个关联周期长的问题。在某些场景下,比如订单今日发货了,而明细表却是一个月前的,这时它的状态保留时间不确定,甚至可能超过了一个月。对此,我们会引入额外的状态管理机制。

65fe64494c0193de1b03016a431d0dbf.jpeg

在分享状态管理机制前,先来阐述一下 Flink 对一些大状态的痛点。

1. 效率。效率问题在小状态的时候是没有问题的,效率很快,但当状态达到 TB 级别,甚至几十 TB,它的读写效率就会显著下降,且状态恢复任务的时间也比较长,通常需要几十分钟的时间。

2. 稳定性。Flink 的状态越大,Checkpoint 的时间越长,这就会导致一些延迟的波动,也就会不满足我们对于高时效的要求。

3. 灵活性。目前社区版 Flink 和商业版 Flink 都只提供了 TTL 这个清理策略,所以我们无法根据业务的一些特性,定制删除这个状态。

74cd20ca5e79abd0f6b9e7a9a0eb4a54.jpeg

基于以上痛点,我们提出了状态外置+冷热分离的方案。对于大状态的业务场景,我们会把状态完全外置到 KV 数据库里,然后把 StateBackend 作为外置数据库的缓存。在缓存里 Flink 算子与数据交互,优先读取 StateBackend 的数据,当流式读取读不到的时候,才会走到外置的冷数据层,也就是外置的 KV 数据库。这样我们就可以尽量减少的访问外部的数据库了。

写入的过程也是 StateBackend 流式写入,但写入冷数据层是 Batch 写入。它虽然不能保证 StateBackend 和 KV 数据库的状态一致性,但我们的业务场景是 AtleastOnce 语义,可以在代码里判断它的业务逻辑,通过业务逻辑规避数据重复。

通过这个框架我们可以实现以下优势。

1. 可以支持更大 TB 级的大状态。大状态的大小取决于外置数据库的存储大小。

2. 月周期级别的 TTL。这个 TTL 可以非常长,可能超过一个月,但它的效率比较高,因为 80%的数据都走到了缓存层。

3. 状态可以查询。比如你可以清晰的定位状态的流转变化,通过 SQL 语句查询当前的状态。另外,我们也可以容忍状态丢失风险,比如 StateBackend 由于版本升级或者其他原因,它的状态消失了,我们可以从 KV 数据库无状态重启。

75c4f8221b710694c15f86f29577ee3b.jpeg

在实时订阅场景中,我们需要对商家保证比较稳定,且延迟非常低的实时性体验,这就要求我们需要保障任务的稳定性和延迟。在这个任务里,我们的服务包括:

1. 按需计算,即只有开通或者订购的商家才会做计算,这样可以节省成本。

2. 商家开通功能后,需要实时看到数据,这就要求我们的订阅逻辑也需要是实时的。

3. 我们需要保障今日新订阅商家今日指标的完整性,不能从第二天才开始算。

所以,我们做了实时订阅任务,保证任务的稳定性。

61d85f742ed222646b01fe93e7786a58.jpeg

热点商家业内俗称数据倾斜。数据倾斜问题我们有两种解法。

第一个优化是订阅流的。我们把本来按照商家粒度聚合的数据打散成商家+订单粒度来聚合。之前视为商家粒度,如果某个商家的数据非常大,它会分发到 TaskManager 下面的某一个 slot,导致 TaskManager 的 CPU 一直拉满。这样它就跑不下去了,延迟也会相应变高。做了打散优化后,可以让所有的 TaskManager 同时触发订阅逻辑,任务的稳定性相对就提高了。

第二个优化,针对分摊任务中有主表和明细表关联的时候,明细表可能出现了几十万条甚至上百万条,主表和明细表关联时的 Key 就会非常大。这时我们把时间窗口划分为 3 秒一个窗口注册定时器,通过定时器触发分摊动作,限制单条订单下最多 3 秒触发一次分摊,有效缓解反压问题。

04

对实时计算的未来展望

025330cf3a69487356819ab2b1ca0d3e.jpeg

对于实时计算未来的展望,我们将围绕流批一体、数据挖掘、风控能力这几个关键词展开。

对于流批一体,我们希望找到能够具体应用 Kappa 架构的场景,提高我们的数据复用性。对于标签体系,当前还没建设比较完整的标签体系,未来会考虑在商家标签或者商品标签方面逐步建设,提高我们内部的运营能力。对于风控能力,我们当前已经有物流预警的风控产品,未来我们将扩展其他的业务场景,比如库存预警、分销价格预警等等,帮助商家解决资损问题。

往期精选

d0f27a054178ee951c6b474330b60c5a.png

0229887f95edf6ce1e016e1e0a0f3e5c.jpeg

b89dd510f4ae29fba2a12719f71d03cf.jpeg

4176cdf0841a0d0fa02a9c28193cbd8d.jpeg

c3f811f603ed63f2f263d3b0dbb459e8.jpeg

▼ 关注「Apache Flink」,获取更多技术干货 ▼

806d55fc408dae155c1178245d9f2858.png

 e334eaf5fab4c50b7e5d9481800b2dbb.gif  点击「阅读原文」,查看原文视频&演讲 PPT

相关文章:

电商 SaaS 全渠道实时数据中台最佳实践

摘要:本文整理自聚水潭数据专家张成玉,聚水潭高级数据工程师应圣楚,在 FFA 2022 行业案例专场的分享。本篇内容主要分为四个部分:实时数仓的建设和发展数据中台的产品体系及架构实时计算的实践和优化对实时计算的未来展望Tips&…...

macos ncnn 安装踩坑记录···

安装真麻烦踩了无数坑,官方给的安装教程:macos安装ncnn, 安装过程老是报错,记录一下卡的比较久的,网上也不好找资料的错. 我的电脑: 1. 使用homebrew 的时候失败fatal: not in a git directory Error: Command failed…...

ESP32设备驱动-AM2301(DHT21)温度湿度传感器驱动

AM2301(DHT21)温度湿度传感器驱动 文章目录 AM2301(DHT21)温度湿度传感器驱动1、AM2301(DHT21)介绍2、硬件准备3、软件准备4、驱动实现1、AM2301(DHT21)介绍 AM2301 湿敏电容数字温湿度模块是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温…...

[数据结构]:16-归并排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 归并排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代码。使用C引用主要是…...

React(七):Router基本使用、嵌套路由、编程式导航、路由传参、懒加载

React(七)一、React-Router的基本使用1.安装和介绍2.路由的配置和跳转3.Navigate的使用4.如果找不到对应的路由路径?二、嵌套路由的用法三、编程式路由导航1.类组件中使用useNavigate2.函数式组件中使用useNavigate四、路由跳转传参1.设置好路…...

Java基础面试题(一)

Java基础面试题 一、面向对象和集合专题 1. 面向对象和面向过程的区别 面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程…...

代码命名规范是一种责任也是一种精神(工匠精神)

代码命名规范之美规范概述命名规范管理类命名BootstrapProcessorManagerHolderFactoryProviderRegistrarEngineServiceTask传播类命名ContextPropagator回调类命名Handler ,Callback,Trigger,ListenerAware监控类命名MetricsEstimatorAccumul…...

奇淫技巧:阅读源码时基于一组快捷键,让我们知道身在何方!

一个十分蛋疼的问题 在我们阅读框架底层源码的时候,我们往往会一个方法一个方法的往下翻,翻了很久很快就会有这样的灵魂拷问:我从那个类(方法)来,我要到哪个(类)方法中去。这个时候…...

你真的弄懂this指向了吗

前言 在说 this 指向之前,请观察以下代码,并说出它们的输出结果: 第 1 组:标准函数 window.color "red"; let o {color: "blue", }; function sayColor() {console.log(this.color); }sayColor(); // 输…...

阿里云服务器使用教程:使用xshell、xFtp工具连接阿里云服务器(Centos7)并修改Centos7的yum源为阿里镜像源

目录 1、下载并安装xshell、xFtp 2、远程连接阿里云服务器 3、 修改Centos7的yum源为阿里镜像源 1、下载并安装xshell、xFtp XShell可以在Windows界面下来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。它支持 RLOGIN、SFTP、SERIAL、TELNET、…...

一文快速入门 HTML 网页基础

专栏简介: 前端从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1.HTML 结构 1.1. 认识 HTML 标签 1.2 HTML 文件结构…...

DEJA_VU3D - Cesium功能集 之 100-任意多边形(标绘)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码,…...

Cadence OrCAD Capture全局修改原理图的非本地库符号的方法图文教程Repalce Catch功能

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,修改方法2.1,新建本地库2.2,待修改搬入本地库2.3,修改原理图符号2.4,全局更新原理图符号3,总结B站关注“硬小二”浏览更多演示视频 1,概述 在完成原理图设计...

npm包版本号详解

npm包在发布时,需要按照包版本语义化中的约定去更新设置,例如我们常见的1.0.0,1.0.1,0.0.1等这样的版本号,那么这些数字分别代表什么意思呢?下面我们将详细介绍。 npm版本号的组成 一个完整的版本号&…...

ubuntu 系统安装docker——使用docker打包python项目,整个流程介绍

目录 1 安装docker和配置镜像源 2 下载基础镜像 3 通过镜像创建容器 4 制作项目所需的容器 5 容器制作好后打包为镜像 6 镜像备份为.tar文件 7 从其他服务器上恢复镜像 8 docker的其他常用指令 首先科普一下镜像、容器和实例; 镜像:相当于安装包&…...

MySQL事务篇

MySQL事务篇 一、一条Insert语句 为了故事的顺利发展,我们需要创建一个表: CREATE TABLE t (id INT PRIMARY KEY,c VARCHAR(100) ) EngineInnoDB CHARSETutf8;然后向这个表里插入一条数据: INSERT INTO t VALUES(1, 刘备); 现在表里的数据就…...

【Redis】搭建分片集群

目录 集群结构 准备实例和配置 启动 创建集群 测试 集群结构 分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个 master包含一个slave节点,结构如下: 这里我们会在同一台虚…...

RoCEv2网络部署实践

延续上篇RoCE网络的介绍,我们知道承载ROCEv2流量必须有一张无损网络。 本章主要介绍在以太网环境部署无损网络的关键点。 首先是QoS,包含流分类和队列调度两部分。 流分类:在网络接入设备(TOR)配置if-match类的语句&am…...

【HashMap】| 深度剥析Java SE 源码合集Ⅱ | 你会吗?

目录一. 🦁 HashMap介绍1.1 特点1.2 底层实现二. 🦁 结构以及对应方法分析2.1 结构组成2.1.1 成员变量2.1.2 存储元素的节点类型2.1.2.1 链表Node类2.1.2.2 树节点类2.1.2.3 继承关系2.2 方法实现2.2.1 HashMap的数组初始化2.2.2 计算hash值2.2.3 添加元…...

剑指 Offer 39. 数组中出现次数超过一半的数字

剑指 Offer 39. 数组中出现次数超过一半的数字 难度:easy\color{Green}{easy}easy 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: …...

使用python控制摄像头

前言 当今,随着计算机技术的发展,摄像头已经成为了人们生活中不可或缺的一部分。而Python作为一种流行的编程语言,也可以轻松地控制和操作摄像头。无论你是想用Python写一个简单的摄像头应用程序,还是想在机器学习和计算机视觉项…...

Linux文件系统

目录 1、常见的linux文件系统 2、文件系统的组成 inode的内容: 可以用stat命令,查看某个文件的inode信息 inode的大小 inode号码 使用 ls -i来查看文件的inode号码 使用 df -i命令,查看每个硬盘分区的inode总数和已经使用的数量&#xff…...

扬帆优配|引活水 增活力 促转型 创业板助力实体经济高质量发展

立异就是生产力,企业赖之以强,国家赖之以盛。全面注册制变革持续开释立异生机。日前,创业板公司已开端连续公布2022年度年度报告和2023年第一季度成绩预告,从频频传来的“喜报”中可窥见立异驱动开展战略下新兴工业的强劲开展态势…...

【c++】:STL模板中string的使用

文章目录 STL简介一.认识string二.string中基本功能的使用总结STL简介 STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本 原始版本 Alexand…...

华为OD机试用Python实现 -【连续字母长度 or 求第 K 长的字符串长度】 | 2023.Q1 A卷

华为OD机试题 本篇题目:连续字母长度 or 求第 K 长的字符串长度题目输入描述输出描述示例一输入输出说明示例二输入输出说明示例三输入输出说明Code代码编写逻辑最近更新的博客 华为od 2023 | 什么是华为od,od...

前端处理并发的最佳实践

什么是并发? 因为js是单线程的,所以前端的并发指的是在极短时间内发送多个数据请求,比如说循环中发送ajax。 举一个简单的例子: 下面一段代码是常规的mount阶段执行的请求: useEffect(async () > {console.time…...

【SOP 】配电网故障重构方法研究【IEEE33节点】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

[MySQL索引]4.索引的底层原理(三)

索引的底层原理(三)哈希索引InnoDB自适应哈希索引哈希索引 memory存储引擎支持的是哈希索引,memory是支持内存的存储引擎。 哈希表中的元素没有任何顺序可言,只能进行等值比较,包括范围搜索、前缀搜索like、order by…...

2023金三银四应届生求职面试指南

一、应届生优势 划重点,一定要走校招;千万不要等毕业之后再想着找工作,在毕业前就要敲定落实;否则,就真的该焦虑了。要知道应届生的身份是一个很吃香的身份;只有应届生可以走校园招聘。 1、那校园招聘跟社会招聘有多大的差距?? 这么说吧&…...

【数据结构】解决顺序表题的基本方法

🚀write in front🚀 📜所属专栏:> 初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论&#xff0…...