您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
大件实时数据指标配置化探索实践
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
大件实时数据指标配置化探索实践
自猿其说Tech
2022-12-21
IP归属:未知
15040浏览
# 1 系统简介 大件数据指标平台是大件大促实时监控数据的核心环节,对大件各条线系统进行实时数据指标SQL查询、计算、汇总,可以将大件各个条线和按照中心、区域、全国等多种维度的单量进行汇总加工计算,涉及大件主要业务生产系统的核心大促指标计算,包含为大件工作台、视界大屏、领航等提供结果数据服务,为大件业务和运营人员提供实时数据监控和运营分析。 # 2 需求理解 ## 2.1 大件通用指标加工服务 ![](//img1.jcloudcs.com/developer.jdcloud.com/4415feeb-0b05-4bd7-81fd-d1b6db2769bf20221201182538.png) 大件生产系统:涉及到大件5个生产系统,作为数据源,由其数据库从库或jsf接口提供元数据。 大件数据指标平台实现以下功能: - 从各个业务系统数据库或调用其提供的jsf接口获取数据,进行汇总和加工。 - 对大件工作台提供指标接口服务,以供其页面展示 大件相关监控页面:调用指标接口服务,页面展示数据指标。 ## 2.2 大促实时监控数据推送服务 整体报表:共计1张; 条线报表:共计7张 KA报表:共计2张; ![](//img1.jcloudcs.com/developer.jdcloud.com/fc9be64e-613e-42a0-9b4d-aa2b11e7903520221201182612.png) 例举其中部分指标口径: ![](//img1.jcloudcs.com/developer.jdcloud.com/7f9f8426-3bfa-4cfc-a038-98dc66413af520221201182631.png) # 3 大促痛点 针对21年双11大促,业务提出在历史指标计算基础上,对仓储、揽收、配送、分拣、家居、KA等维度计算大促实时数据指标进行新增或修改,共涉及226条指标计算,研发侧需针对所涉指标按照业务口径加工计算,且口径存在变更调整情况。大促期间,需保证大件工作台首页概揽指标10s以内延迟,保证大促期间每小时加工推送一次所有条线数据。 痛点: - 涉及业务指标数量较多 - 部分业务指标口径判断条件稍多且各不相同 - 90%以上的指标需要动态时间作为指标入参 - 业务口径动态时间入参生成规则,大促期间会需要根据大促生产进行调整 - 指标计算需要实时性,保证延迟在10s以内。 - 业务指标涉及部门内部各个生产系统,需要从多个生产系统获取数据。 - 若指标加工研发分摊到各个生产系统,则整体研发成本、协调沟通成本较高,可能出现大促期间指标开发延期的风险。 # 4 技术方案 ## 4.1 设计思路 ### 4.1.1 基本设计思想 1. MapReduce设计模式和编程模型。 1. 面向接口编程,对各个系统的数据进行接口封装隔离 1. 分层设计思想和架构,分为数据源、数据合并、数据查询、数据汇总加工; ![](//img1.jcloudcs.com/developer.jdcloud.com/2ab06fe6-d099-465a-8241-9d251dec91fd20221201182835.png) ### 4.1.2 针对大促技术升级思路 1. 新老兼容同时从MySQL和ES进行数据查询,ES查询提供查询效率稳定性,保证大促期间工作台查询接口性能; 1. 时间切片算法,将影响行数多的SQL切片为多条影响行数小的SQL,减少SQL执行耗时;查询结果缓存,降低多次进行MySQL数据库查询压力。 1. 配置化,支持SQL语句、查询数据库、时间分区步长等灵活配置,降低业务调整口径带来的代码研发量,降低大促期间代码改动次数,保证大促系统稳定性。 ## 4.2 整体技术方案 ![](//img1.jcloudcs.com/developer.jdcloud.com/ebc48de9-91b6-4dda-9173-b7a42b4196df20221201182915.jpg) 1. 应用层:对外提供数据指标API,支持将结果数据生产Excel文件并通过咚咚发送;选举机制保证分布式集群执行唯一定时任务,调用数据指标加工服务生成实时或非准实时数据。 1. 数据汇总层:大促条线数据异步线程处理器、KA数据异步线程处理器使用jsf动态调用,将大促或KA等特殊业务指标数据从数据查询层获取结果数据,加工或补全(配送中心名称、区域信息等)业务数据后生成结果数据报文;也支持通用配置化异步线程处理器,将配置中心里多条数据查询配置项,按照配置从数据查询层获取每条配置项结果,支持对结果数据进行(配送中心名称、区域信息等)业务数据补全,支持(例如:配送中心维度转区域维度)业务维度转换; 1. 数据查询层:从配置中心获取数据查询配置,以一条数据查询配置为例,支持将入参时间按照指定步长进行时间切片算法切片,每个时间切片执行SQL语句从数据库(或缓存中)获取,支持单时间切片结果存储至jimdb缓存,将所有切片结果汇总,即可得到此条数据查询配置的完整结果数据; 1. 数据存储:源数据来源于多个业务系统数据库或ES存储中间件,结果数据支持存储到MySQL数据库,后续拓展存储至ES集群。 ## 4.3 关键技术点 ### 4.3.1 时间切片算法 1.时间切片: ![](//img1.jcloudcs.com/developer.jdcloud.com/f3f7fe0a-a100-401e-aae2-0b704809875c20221201183010.png) 以15分钟为单位,将数据按照单位时间段进行切片,最后一个切片时间区间<=15分钟。实际SQL中,SQL语句中根据计算需求,入参业务时间可分为以下两种情况: - 按照0点到当前时间计算指标时,如:按照接单时间计算今日当前接单量,入参时间为["2020-06-18 00:00",“2020-06-18 10:10”],被划分为["2020-06-18 00:00",“2020-06-18 00:15”]、["2020-06-18 15:00",“2020-06-18 30:00”].....["2020-06-18 10:00",“2020-06-18 10:10”]总计37个时间切片。 - 按照全天24小时计算全天时间维度计算指标时,如:按照接单时间计算昨日全天接单量,00:00-23:59,以15分钟为单位,将昨日整体划分总计96个时间切片。 2.切片汇总缓存: 使用具体的Executor(比如DBExecutor)按照每个时间分区为入参从数据库(或redis缓存)中查询出并缓存每个时间分区的单量,利用AbstractParallelCounter中的count方法,线程执行Executor并遍历每个线程结果List<Map>;多条结果按照uniquekey将当前所有的Map融合到最终的结果集中,对外返回合并后的List<Map>对象。 ### 4.3.2 切片补偿算法 ![](//img1.jcloudcs.com/developer.jdcloud.com/54f71c8f-e6a3-4987-b7f1-e9959a33d30020221201183117.png) 定时任务按照固定频次去调用计算数据的接口,当接口采用时间切片算法计算时,将得到0~当前时间的每个时间切片(['2020-06-18 00:00','2020-06-18 00:15']、['2020-06-18 00:15','2020-06-18 00:30']....['2020-06-18 hh:(mm-15)','2020-06-18 hh:mm']),循环判断每个时间切片,执行入以下逻辑: 1. 时间切片开始时间非最近1小时,且非23点时,当前时间的分钟数=时间分区开始时间分钟数,即当前时间为02:15时,得到的切片中有00:15、01:15时,予以使用DBExecutor从数据库查询并更新(若有侧更新,无则新增)当前时间切片结果至缓存。 同时开启定时任务调用以上逻辑(执行频次为2秒),假设当前时间为02点15分,同一分钟以2秒执行频次会触发多次执行,因此按照SQL+日期+小时+分钟作为key加锁,只允许执行一次,防止多次执行,对系统造成过大压力。 1. 当时间切片开始时间为最近1小时,为保证最近计算的指标为最新数据,直接执行DBExecutor,查询数据库获取当前时间切片数据。 1. 时间切片开始时间小时=23时,因23小时的4个时间切片为所在天数的最后4个切片,下一小时为第二天计算第二天数据,不会更新当天23小时切片数据,因此23小时的切片全部执行DBExecutor,直接从数据库获取当前切片数据。 ### 4.3.3 配置化 配置中心包含以下内容: ![](//img1.jcloudcs.com/developer.jdcloud.com/719f1b22-8f5e-47e5-b871-0efce9a10e9320221201183222.png) - 配置编码:定义一个唯一的配置编码,保证配置项唯一性 - 开关:支持开关控制,判断配置是否可以执行并生效k - 数据源:配置已事先接入数据源的枚举值,从数据源对应的数据库获取数据 - SQL语句:根据业务指标口径编写对应的SQL语句 - SQL语句入参时间生成策略:根据业务需求,配置相应入参策略枚举的枚举值,动态生成SQL语句入参时间(开始时间、结束时间),后续将此时间区间进行切片算法处理。 - 时间分区步长配置:使用时间切片算法,按照切片单元进行计算,此处配置步长,如配置60即为60分钟为一个分区单元 - 结果汇总Key:根据select查询结果一项为数据出参维度,将多切片单元结果进行汇总 - 数据输出JsonPath路径配置:使用JsonPath插件将加工后数据填充到json格式报文配置路径中。 配置范例: ``` <!--KA清理率类指标配置项--> <!--执行SQL计算的配置,每个SQL对应一个配置项--> <!-- 1.接单量(全国非自营+全量商家) --> <bean id="kaTotalReceiveCount" class="com.jd.report.quota.config.ReportConfig"> <!--配置编码--> <!--数据源,选用DataSourceEnum枚举的dataSourceName--> <property name="dataSourceName" value="OLP_REPORT_DATA_SOURCE_SALVE3" /> <!--数据查询层--> <!--可选,唯一key,用于数据查询底层汇总,默认dcNo--> <property name="uniqueKey" > <!--每个指标结果对应一个--> <list> <value>dcNo</value> </list> </property> <!--结果汇总结果key,为SQL中as后的key--> <property name="countColName"> <!--每个指标结果对应一个--> <map> <entry key="orderCount" value="$.kaComplete.total.receiveCount"/> <entry key="orderCountKa" value="$.kaComplete.allKa.receiveCount"/> </map> </property> <!--执行SQL,注意:大于号使用>替换,小于号使用<替换--> <property name="sql" value="select w.from_delivery_id AS dcNo, sum(1) AS orderCount, sum(case when substring(w.sendpay,100,1) = '1' and w.network_type = 0 then 1 ELSE 0 end) AS orderCountKa from 表名 w where w.is_delete = 0 and w.create_time >= STR_TO_DATE(?,'%Y-%m-%d %H:%i:%s') and w.create_time < STR_TO_DATE(?,'%Y-%m-%d %H:%i:%s') and w.waybill_type IN (0,1) and w.waybill_status != 'CANCEL' and w.delivery_type != 1 and w.is_forward_waybill = 0 group by w.from_delivery_id" /> <!--可选,时间切片算法,对应入参时间区间策略,见枚举--> <property name="timeSectionStrategy" value="11-10-20-t" /> <!--可选,时间切片算法,单位分钟,默认60--> <property name="atomTimeLength" value="15" /> <!--数据汇总处理层--> <!--可选,数据补全策略,默认补全区域--> <property name="fillStrategy" value="fillAreaInfo" /> <!--可选,数据处理(转换)策略,默认不处理,实现见ConfigHandlerStrategyEnum类--> <property name="handlerStrategy" value="convertArea" /> </bean> ``` ## 4.4 能力延伸 支持将加工出的JSON报文数据,按照报文结构和业务字段落库进行配置化,系统自动根据配置进行动态化存储到Mysql数据库。 ## 4.5 适用场景 约束:支持JDBC链接的(MySQL、TiDB等)数据库 - 场景1:数据库执行SQL语句,实时数据指标查询和汇总 - 场景2:数据库执行SQL语句,非准实时数据查询和汇总,定时指标加工、存储,支持咚咚推数数据文件链接 # 5 业务实践 ## 5.1 大件工作台首页概览指标 为大件工作台提供首页概览数据指标加工,页面展示: ![](//img1.jcloudcs.com/developer.jdcloud.com/a7b281cb-4bd7-43e2-aac9-01dafb2192cf20221201183359.png) ## 5.2 大件实时监控大屏 为大件实时监控大屏提供数据指标加工,页面展示: ![](//img1.jcloudcs.com/developer.jdcloud.com/1f18f5b8-ebd9-4ff5-83d6-f4743827f1c620221201183438.png) ## 5.3 大件大促推数Excel 推送详情为Excel指标文件,内容展示: ![](//img1.jcloudcs.com/developer.jdcloud.com/286bac94-c9c0-4070-a3f7-a3e043256db720221201183458.png) 并支持将Excel文件咚咚通知指定人员,效果展示: ![](//img1.jcloudcs.com/developer.jdcloud.com/133ae5ad-cdbd-482d-a347-edc5d9d032fa20221201183747.png) ## 5.4 其他业务场景 举例: - 京东动力页面查询加工结果数据,支持MySQL链接方式 - 业务临时提数,推送指标结果数据文件 ------------ 自猿其说Tech-JDL京东物流技术与数据智能部 **作者:郭珍**
原创文章,需联系作者,授权转载
上一篇:数据同步gossip协议原理与应用场景介绍
下一篇:巧用GenericObjectPool创建自定义对象池
自猿其说Tech
文章数
426
阅读量
2149963
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149963
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号