交易日均千万订单的存储架构设计与实践 | 京东物流技术团队

news2024/10/6 2:28:14

一、订单系统概述

1.1 业务范围

服务业务线:快递、快运、中小件、大件、冷链、国际、B2B合同物流、CLPS、京喜、三入三出(采购入、退货入、调拨入、销售出、退供出、调拨出)等

1.2 订单中心价值

1、解耦(提升系统稳定性

**原系统:**交易与生产耦合在一起,业务新增需求,涉及个上下游多个系统。ECLP、外单、运单、终端系统等。多条业务线的逻辑耦合在一起,单一业务条线的需求改动,涉及原系统中其他业务线的关联改造。

**新系统:**交易与生产运营解耦:交易相关的需求在订单的域内解决;生产侧的需求,在生产域内解决,减少上下游的相互影响。

业务条线接耦:不同业务线,业务流程不同,单一业务条线的需求改动,只在具体的流程中做迭代更新,不影响其他业务线。提升整个流程和业务的稳定性。

2、提升新业务接入速度

订单中心向前台提供可复用的标准能力,提升新业务的导入速度。

订单中心将原系统中的大应用,拆分、抽象为多个小的应用组合,并支持不同场景下按需编排业务流程。新业务通过对中台公共标准能力的复用,可快速接入订单中心,避免相同功能的重复建设。

3、提供全局化统一数据模型

**原系统:**订单分属于多个系统,外单、ECLP、大件系统,有多套数据库,业务语义不统一,不便于数据化建设。

**新系统:**订单中心统一定义订单的标准数据模型,让不同业务的数据,沉淀在同一系统,减少订单域相关功能的重复建设,避免资源浪费,打破部门壁垒。使得数据和流程可以集中得以管理和优化,为集团经营分析、**预测京东未来的创新空间,**提供订单域的标准数据。

二、架构介绍

2.1 整体架构设计

通过技术中台架构升级项目,将交易体系以新的接入-交易-履约-执行四层架构进行重新搭建。其中交易订单负责物流与客户之间产生物流服务契约的单据流量收口,同时承载向下游OFC(订单履约层)分发的职责。

2.2 实时数据层架构设计

2.2.1 系统交互图

系统交互如下:

订单中心的标准接口在上层做了单据收口,同时我们在数据层也做了统一的收口。

业务架构与数据解耦,分布式数据库、缓存、一致性等高可用、高性能设计从业务架构范畴剥离,使业务架构聚焦在业务自身。

持久化系统:用于支撑接单、订单修改、订单取消、订单删除等数据持久化。

搜索系统:提供订单详情查询、订单列表查询、订单状态流水查询、判断是否百川订单等服务。

中继系统:数据枢纽,通过消费消息队列将订单数据写入Elasticsearch、HBase、MySQL。

数据对账系统:用于对比多套存储中间件的数据是否一致,以保障数据最终一致性。

数据同步系统:将订单列表查询所需的查询条件和列表展示字段从老系统同步至订单中心,用于解决因切量过程中订单数据存在于新老系统中而分页困难的问题。

2.2.2 技术架构图

• 【读写分离架构】采用读写分离架构模式(CQRS),将订单读写流量分离,以提高查询性能和可扩展性,同时达到读、写解耦。

• 【缓存】使用分布式缓存Redis缓存热门订单数据以及与订单相关的信息提高并发和响应速度减少对HBase的访问,同时,通过主、备、临时3套高性能缓存以提升系统容灾能力。

• 【消息队列】使用消息队列JMQ实现异步处理订单提升系统吞吐量,同时流量削峰减轻直接请求ES、HBase、数据库的压力。将不同业务场景(如下单、回传)使用不同的Topic进行隔离,可以更好地管理和维护;将不同业务使用不同的Topic隔离,可以实现消息的并行处理和水平扩展,提高系统的吞吐量和性能。

• 【复杂查询】使用搜索引擎Elasticsearch解决订单复杂查询,先通过Elasticsearch获取订单号,然后根据订单号查询分布式缓存Redis+列式数据库HBase。

• 【低成本持久化存储】采用HBase列式数据库以支持海量数据规模的存储和极强的扩展能力。

• 【数据一致性】通过强事务、最终一致、幂等、补偿、分布式锁、版本号等实现

• 【多租户架构】系统中采用多租户数据模型,将租户的数据分离存储,以确保数据的隔离性和安全性。根据不同租户的需求动态扩展系统的容量和资源,可以支持系统的水平扩展。通过共享基础设施和资源,多租户架构实现了更高的资源利用率和降低成本。

2.3 设计优势

2.3.1 高可用

• 应用服务器、MySQL、Redis、HBase、JMQ等均跨机房部署;ES单机房部署,搭建ES主备双机房集群

• 隔离、限流、熔断、削峰、监控

2.3.2 高性能

• 高性能缓存

• 异步化

2.3.3 海量数据处理

• 分库分表

• 冷热分离

• 列式存储(HBase)

2.3.4 数据安全

敏感信息加密存储,Log、Redis、ES、MySQL、HBase等均采用加密存储,“谁存储谁加密,谁使用谁解密”。

三、订单数据模型

3.1 PDM模型

在订单模型设计上,基于统一业务属性、抽象通用模型、归纳共性实体的原则,将订单模型主要分成了订单的主档信息、订单的货品信息、订单的物流服务信息、订单的营销信息、订单的财务信息、订单的客户渠道信息、订单的收发货信息、订单的操作信息、订单的扩展信息等几类

3.2 模型扩展性

3.2.1 标准模型扩展性设计

订单中存在几十上百个标识字段,若每次都采用新增字段形式,订单业务属性、数据模型会大量膨胀,腐蚀模型,同时开发效率较低,故采用KV形式承接和存储。将标识划分到各个业务域中,如订单标识、货品标识、营销标识等。

3.2.2 个性化业务模型扩展性

针对个性化业务,提供了一套可配置的数据库字段管理方案,通过开箱即用的一些设置,订单在提交、修改、查询时,可以根据业务身份+业务类型+业务字段找到不同的数据模型以及数据扩展编码,即找到存储到哪张表哪个字段。在每张表都预留N个扩展属性,同一个扩展属性,不同的业务身份+业务类型表示不同的含义,以此实现扩展存储。

四、未来及挑战

4.1 订单个性化查询

个性化查询需求增多,如模糊查询、根据查询条件实时聚合等需求,若ES索引都放在同一个集群中,会影响整体集群稳定性,但拆分后该业务数据无法与其他业务一块查询展示。

4.2 单元化架构

当前接单持久化TP99是47ms,在非跨机房情况下TP99是20ms,从数据来看,跨机房对性能影响很大。

单元化,可以让同一个用户的相关请求,只在一个机房内完成所有业务「闭环」,不再出现「跨机房」访问。单元化的部署方式,可以让每个机房部署在任意地区,随时扩展新机房。通过单元化,持续加强订单平台的基座稳固。

4.3 硬件成本控制

订单日均单量不断上升,数据量越来越大,随之而来是硬件成本的增加,如何控制硬件成本增加,是当下及未来的一项挑战。我们计划通过数据归档、冷热温数据分层等方式来降低数据存储成本。

作者:京东物流 王卫东

来源:京东云开发者社区 自猿其说Tech 转载请注明来源

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

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

相关文章

基于Spring Boot的房屋租赁系统

目录 前言 一、技术栈 二、系统功能介绍 租客功能模块的实现 ​编辑 管理员功能模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高…

Unity HDR 无线延申的网格效果

无线延申的网格 该项目必须是再HDR项目 shader代码实现 Shader "Unlit/infTutorial1" {Properties{_Alpha ("Alpha", Range(0, 0.5)) 0.5}SubShader{Tags{"RenderPipeline""UniversalRenderPipeline""RenderType""…

【Java】基于物联网技术的智慧工地源码(项目端、监管端、APP端、智慧大屏)

智慧工地是将云计算、大数据、物联网、移动技术和智能设备等信息化技术手段,聚集在建筑工地施工管理现场,围绕人员、机械、物料、环境等关键要素,建立智能信息采集、高效协同管理、数据科学分析、过程智慧预测,最终实现建筑工地的…

工厂漏水怎么预防?教你一招,百试百灵

随着工业化的迅速发展,工厂和生产设施在现代社会中扮演着至关重要的角色。然而,这些设施在日常运营中也面临着各种各样的风险和挑战,其中之一是水浸事件。 水浸事件可能是由于天灾、设备故障、管道泄漏或人为失误等原因引发的,但无…

单片机上软字库换32进制存储,空间占用少20%

在之前的单片机字库建立的推送中: https://blog.csdn.net/platform/article/details/130742775, 存储了GB2312字符集对应的软字库文件,在16*16的编码下总字库的507KB,后来把字体切换成了12*12,软字库缩减到了301KB。当然这里面对…

速卖通商品详情数据接口

速卖通商品详情数据接口(aliexpress商品详情API接口)可以获取到速卖通商品的详细信息,如商品标题、价格、库存、详情描述、图片等。 速卖通商品详情API接口是速卖通提供的一种产品数据接口,可以帮助速卖通卖家快速地将产品分类、…

一个高效、简洁、轻量的一站式研发管理平台,协作一站式

一、开源项目简介 Codes 是一个 高效、简洁、轻量的一站式研发管理平台。包含需求管理,任务管理,测试管理,缺陷管理,自动化测试,cicd 等功能;Codes 帮助企业加速融合研发、测试、运维一体化进程 常态下,刀…

正态分布的概率密度函数|正态分布检验|Q-Q图

在正态分布的概率密度函数中,自变量 X 是一个随机变量,表示我们要研究或测量的某一现象或事件的取值。正态分布的概率密度函数用来描述这个随机变量的概率分布情况,即在不同取值上的概率密度。 具体来说,对于正态分布的概率密度函…

【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析

简述 当进行需求分析时,通常着重考虑三个主要层次:业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性,用户需求明确最终用户的期望,而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…

12款最火的AI画图软件,助你探索创新设计

ChatGPT火爆出圈,AI画图软件也如雨后春笋般流行起来。各类AI画图的软件工具横空出世,设计师与其焦虑工作会不会被人工智能取代,不如践行“工欲善其事必先利其器”,开拓思路,打开格局,好好地探索下如何利用好…

Apache HTTP Server 2.4.49 路径穿越漏洞 (CVE-2021-41773)

Apache HTTP Server 2.4.49 路径穿越漏洞 (CVE-2021-41773) 文章目录 Apache HTTP Server 2.4.49 路径穿越漏洞 (CVE-2021-41773)1 在线漏洞解读:2 环境搭建3 影响版本:4 漏洞复现4.1 执行漏洞核心指令4.2 进行访问使用bp抓包4.3 尝试执行指令4.4 反弹shenll成功 1 …

039:vue中数字货币化快速显示

第039个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

Python程序设计实例 | 爬取机场航班信息

案例中将展示机场官网中航班信息(如机场航班的离港与进港信息)的爬取过程。有兴趣的读者可以在本案例的基础上对数据进一步分析,或是对爬虫做进一步的开发,增加更多功能。 请求、解析、处理数据是通用爬虫的三个步骤,在本案例中,…

一文了解什么SEO

搜索引擎优化 (SEO) 是一门让页面在 Google 等搜索引擎中排名更高的艺术和科学。 一、搜索引擎优化的好处 搜索引擎优化是在线营销的关键部分,因为搜索是用户浏览网络的主要方式之一。 搜索结果以有序列表的形式呈现,网站在该列表中的排名越高&#x…

一个含不少免费额度和数据下载的IP地址来源查询工具

大家好,我是TJ君! 如今在国内运营的各种互联网应用都有接入IP来源显示的要求,现在相关API的供应商也很多。今天TJ刚好看到一个不错的,所以马上给大家推荐一下。 这款不错的产品名称为:IPInfo 产品特性 该IP查询工具…

解决 react 项目启动端口冲突

报错信息: Emitted error event on Server instance at:at emitErrorNT (net.js:1358:8)at processTicksAndRejections (internal/process/task_queues.js:82:21) {code: EADDRINUSE,errno: -4091,syscall: listen,address: 0.0.0.0,port: 8070 }解决方法&#xff…

第二证券:美国政府又要“关门”?3万亿市值蒸发!

上星期,欧美股市全线跌落,科技股大跌,纳斯达克指数跌逾3%,苹果、微软、谷歌、亚马逊、英伟达、特斯拉、脸书母公司Meta等七大科技股上星期市值算计削减4615亿美元(合人民币3.37万亿元)。 本周市场将发布我…

查看吾托帮88.47的docker里的tomcat日志

步骤如下 (1)ssh (2)ssh root192.168.88.47 等待输入密码:fytest (3)pwd #注释:输出/root (4)docker exec -it wetoband_deploy /bin/bash #注释&#xff1…

jmeterbeanshell调用jsonpath获取对应值

1.jmeter 新建线程组、Java Request、BeanShell Assertion、View Results Tree 2、在BeanShell Assertion中贴入代码: import org.apache.jmeter.extractor.json.jsonpath.JSONManager; import java.util.List; JSONManager js new JSONManager(); String jsonStr…

Vuex命名空间及如何获取根模块、兄弟模块状态管理器

模块化思想 import global from ./modules/global; import form from ./modules/form; import formDesign from ./modules/form-design; ...const store new Vuex.Store({state: {},mutations: {},actions: {},strict: true,modules: {global,form,formDesign,...},... } 此时…