您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
库存快照稳定性解决方案
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
库存快照稳定性解决方案
自猿其说Tech
2022-02-16
IP归属:未知
30960浏览
### 1 业务背景 OMS库存作为交易平台核心环节,其库存准确性对供应链、销售平台非常关键;故部分商家需要OMS某一时刻的静态库存数据,用于销售平台库存进行对账,部分商家(MUJI)直接用OMS库存覆盖销售平台库存。因此库存快照的稳定性对商家来说是至关重要的。 以上背景下,**库存中心对库存快照功能进行重构,要求满足以下要素:** - 数据质量保障 - 对外提供快照查询接口性能 - 库存快照模块高可用 ### 2 概要设计 #### 2.1 系统架构图 ![](//img1.jcloudcs.com/developer.jdcloud.com/531726b2-2da3-45d2-8750-2d124780aca620220216140857.png) #### 2.2 快照流程图 ![](//img1.jcloudcs.com/developer.jdcloud.com/50a9d1ec-67a0-4103-89ef-8b51c3060bbf20220216140911.png) #### 2.3 抽数流程 1. 启动数据抽取任务; 1. 数据抽取TASK 查询游标查询数据库,包括saleable_warehouse_stock、other_warehouse_stock,更新任务数据源为DB; 1. 查询数据库规则:数据库超时时间10S,当前查询失败时,重试3次,3次后返回异常; 1. 数据库查询返回异常,启动ES查询,更新任务数据源为ES;(二期) 1. 查询ES规则:ES超时时间10S,当前查询失败时,重试3次,3次后返回异常; 1. 查询数据库、ES失败后,发送UMP报警; 1. 查询成功后,发送JMQ,递增更新发送JMQ数据量,若查询完成,更新查询完成状态。 1. 数据库、ES每次查询完成后,检查TASK版本,如果版本不一致,销毁当前任务; 1. 检查TASK版本一致后,继续循环当前查询,更新任务时间戳。 #### 2.4 监控流程 1. 启动调度任务守护线程; 1. 检查抽数任务是否完成; 1. 完成后,更新任务状态; 1. 正在进行时,检查时间戳; 1. 时间戳超过30S(实际配置),重新启动TASK,更新版本号version。 #### 2.5 写入流程 1. 读取JMQ信息; 1. 写入ES,ES主键:事业部编码、商品编码、仓库编码、商品等级、库存类型、库存状态、数据时间 1. 判断写入状态是否完成,若完成,查询ES数量,对比JMQ写入数据量 1. 若数量相等,更新任务为已完成,并启动数据校验流程。 #### 2.6 校验流程 1. 根据任务数据源,分别查询数据库、ES库存总条数、总库存量; 1. 查询ES库存快照总条数、总库存量; 1. 校验规则: - 差异对照百分比,可以进行配置。 - 快照总条数*(1+2%)>源数据总条数> 快照总条数*(1-2%) - 快照总库存*(1+2%)>源数据总条数> 快照总库存*(1-2%) 4.若校验失败,更新任务状态为校验失败,发生UMP报警; - saleableTotal(数据总条数) - saleableQueryTotal(分页查询累计总条数) - otherTotal(数据总条数) - otherQueryTotal(分页查询累计总条数) - writeTotal(写入ES累计总条数) #### 2.7 监控队列Redis lists 将任务监控主key放入队列,监控任务扫描队列检测任务各数据状态 监控数据结构使用Redis hash 任务监控主key格式EBU:2021-04-26 **包含字段:** - taskId(任务ID) - taskState(任务状态:0:执行中,1:完成 -1:异常) - restart(0:未启,大于0重启次数) - threadId(线程唯一标识) - heartbeat(线程心跳时间戳) - heartbeatFailCount(心跳检测失败记数) - heartbeatFailUpperLimit(心跳检测失败上限值,达到最大失败次后重启任务) - heartbeatInterval(上报心跳间隔默认5秒) ES按天创建索引名规则:warehouse_stock_snapshot_20200426 ES索引表结构mapping ```json { "mappings": { "saleable_warehouse_stock": { "dynamic": "strict", "_all": { "enabled": false }, "properties": { "deptNo": { "type": "string" }, "sellerNo": { "type": "string" }, "goodsNo": { "type": "string" }, "warehouseNo": { "type": "string" }, "goodsLevel": { "type": "string" }, "stockStatus": { "type": "long" }, "stockType": { "type": "long" }, "stockNum": { "type": "integer" }, "usableNum": { "type": "integer" }, "updateTime": { "type": "date", "format": "strict_date_optional_time||epoch_millis" }, "dt": { "type": "string", } } } } } ``` ### 3 查询接口及快照配置 库存快照抽取配置:https://cf.jd.com/pages/viewpage.action?pageId=480540593 库存快照查询接口:https://cf.jd.com/pages/viewpage.action?pageId=480533874 ### 4 总结 综上所述,采用守护线程可以解决库存快照生成的稳定性,能够确保将某一时刻的数据回传给商家;但是为了保证对账更准确,业务接入时,需要评估以下要素: - 确认库存量大小,交易库存对外承诺数据抽取在30分钟内但是否能在30分钟内完成还需要看数据量的大小 - 库存快照抽取期间,由于实时单据,会有库存时差,需要业务评估,期间是否停止生产、下单、仓内作业,以及不停止对业务影响 - 凌晨00:30 分有临期过期计算,持续时间30min—1h,影响需要业务评估 ------------ ###### 自猿其说Tech-JDL京东物流技术发展部 ###### 作者:孙静
原创文章,需联系作者,授权转载
上一篇:京东短网址高可用提升最佳实践
下一篇:MYSQL磁盘整理实践
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
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
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号