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

news2024/9/30 5:40:27

摘要:本文整理自聚水潭数据专家张成玉,聚水潭高级数据工程师应圣楚,在 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2019年MathorCup数学建模B题环形穿梭车系统的设计与调度解题全过程文档及程序

2019年第九届MathorCup高校数学建模挑战赛 B题 环形穿梭车系统的设计与调度 原题再现: 整体求解过程概述(摘要) 环形穿梭车系统为集多种高新技术于一体的自动搬运设备,行驶和输送速度快、灵活性好、自动化程度高。但由于系统采用封闭式轨道&#xff0c…

成为AI架构师的三大能力

AI架构师的定义 “AI 架构师”是以深度学习为代表的第三次AI热潮所催生的新型复合型人才,它的产生最本质的驱动因素是AI产业化落地应用的蓬勃发展对人才的需求,深度学习突出的工程属性也特别需要复合型人才来驾驭。 从字面来看,AI架构师的“…

Pytorch深度学习实战3-8:详解数据可视化组件TensorBoard安装与使用

目录1 什么是Tensorboard?2 Tensorboard安装3 Tensorboard可视化流程4 Tensorboard可视化实例4.1 常量可视化4.2 特征图可视化1 什么是Tensorboard? 在深度学习领域,网络内部如同黑箱,其中包含大量的连接参数,这给人工…

续航乱标销量低迷! 零跑汽车短时“掉”电快 ?

【锋巢网】 进入3月,行业复苏的景象映入眼帘,但是新能源车企却有人欢喜有人愁。 近日,各大新能源车企公布了自家2月份的销量数据,整体来看,部分新能源车企在2月份的交付量战绩显著,涨幅颇高。其中&#x…

class01:VUE简介与实例挂载

目录一、VUE简介1. 介绍2. 学习内容3. 引入Vue4. 全局配置5. Vue Devtools安装二、挂载Vue实例一、VUE简介 1. 介绍 Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不…

九、CSS3新特性三

文章目录一、逐帧动画二、flex弹性盒子三、少量元素侧轴对齐方式四、折行侧轴对齐方式五、项目属性六、网格布局七、网格布局的对齐方式八、网格布局的项目合并一、逐帧动画 一张背景图,改变back-position-x的位置让他动起来 step-start 逐帧动画 animation: play …

宝塔webhook自动化打包vue项目时,npm不生效问题

文章目录📋前言🎯查看webhook配置的代码🎯测试代码,检查输出内容🎯解决方法📋前言 这篇文章主要是记录和解决在宝塔面板中,webhook自动化打包vue项目时,npm不生效问题。说来奇怪&am…

【DBC专题】-10-CAN DBC转换C语言代码Demo_接收Rx报文篇

案例背景(共15页精讲): 该篇博文将告诉您,CAN DBC转换C语言代码Demo,只需传递对应CAN信号关联参数,无需每个信号"左移"和"右移",并举例介绍:在CANoe/Canalyzer中CAPL中的应用&#xff…

【MIT 6.S081】Lab1: Xv6 and Unix utilities

Util概述sleeppingpongprimesfindxargs本Lab包括五个应用程序的实现,初步熟悉系统调用接口。用时约8h(我太菜辣)本Lab包括五个简单程序的实现,初步熟悉系统调用接口。 笔者用时约6h(我太菜辣) 概述 根据文…

mysql数据库之全局锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#x…

【Day2】Numpy简单入门基础

NumPy 简单入门基础 我的另一篇文章 : Numpy介绍-深度学习:Numpy介绍-深度学习(Numpy介绍深度学习使用看这些足够了) import numpy as npmy_array np.array([1, 2, 3, 4, 5]) print(my_array)[1 2 3 4 5]print(my_array.shape)…

Kafka 多线程消费者

Kafka 多线程消费者多线程方案Kafka 0.10.1.0 后,Kafka Consumer 变为双线程的设计 : 用户主线程 : 启动 Consumer 的 main心跳线程 (Heartbeat Thread) : 定期对 Broker 发送心跳请求,探测消费者的存活性 (liveness)将心跳频率与主线程处理…

MQTT协议-取消订阅和取消订阅确认

MQTT协议-取消订阅和取消订阅确认 客户端向服务器取消订阅 取消订阅的前提是客户端已经通过CONNECT报文连接上服务器,并且订阅了一个主题 UNSUBSCRIBE—取消订阅 取消订阅的报文同样是由固定报头可变报头有效载荷组成 固定报头由两个字节组成,第一个…

2023年,当我们谈论架构时,我们要聊什么

架构是一个非常宽泛的话题,从组织结构上来说,涉及到前端、后端、运维;从软件设计上来说,涉及到需求分析、设计、编码、测试;从物理结构上来说,涉及到CDN、负载均衡、网关、服务器、数据库。当前一些架构方面…

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

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

RK3568平台开发系列讲解(显示篇) DRM显示系统组成分析

🚀返回专栏总目录 文章目录 一、DRM Framebuffer二、CRTC三、Planes四、Encoder五、Connector沉淀、分享、成长,让自己和他人都能有所收获!😄 📢让我们分析一下绿框中的五个部件,以及他们的联动。 一、DRM Framebuffer 与 framebuffer一样,是一片存放图像的内存区域,…

敏捷开发还需要PRD吗

一、PRD有什么用 prd提升与RD或者未来接手人的沟通效率 二、为什么会有PRD 首先来说说为什么会有PRD文档。 1、稍微大一点的团队产品经理未必能向每个人传达产品需求,这就需要有一个文档的形式来向项目的所有成员来传达需求,这就是文档的来源。 2、由…

Python读写mdb文件的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

MySQL的分库分表?通俗易懂

1- 为什么要分库分表 如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从)&a…

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

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