订单系统设计 —— 订单管理

2023-11-12

一、方案背景

  订单系统是存在于各行各业的一个很基础、核心的业务系统。随着互联网的发展,订单系统的管理方案也在不断变化,订单数据规模的膨胀、用户对数据的重视,以及新的技术等都会影响订单管理方案。

1.1 考虑因素

  • 数据量: 订单的特点是只增不减,随着时间推移,订单量会越来越多;

  • 多维查询分析: 能够灵活的支持不同角色用户多种维护的查询和分析;
    在这里插入图片描述

  • 性能: 订单管理服务需要只能高并发、低延迟;

1.2 数据特点

  订单数据具有明显的时间属性,主要呈现出两个特点:

  • 特点1:时间越久的订单被访问到的概率越低;
  • 特点2:订单规模随着时间推移不断变大,GB、TB,甚至PB等;
    在这里插入图片描述

二、方案演进

  技术架构不是设计出来的,是演化出来的。订单管理方案也是随着业务和技术的发展,不断演化的,如下图所示。按照技术架构特点,大致分为三类:

  • MySQL架构:通过扩展库表数量来提升读写能力和存储容量;
  • MySQL + NoSQL架构:MySQL提供事务能力,NoSQL保障海量数据的存储和多维查询分析能力;
  • NewSQL架构:期待成熟的产品出现,兼容MySQL、NoSQL二者优势;
    在这里插入图片描述

说明: 订单是个性化的数据,每个用户的订单数据都不同,不适合使用缓存;

三、MySQL架构

3.1 单库单表

  最简单的订单管理方案,适用于创业初期,便于商业模型的快速落地验证;

3.2 读写分离

解决问题: 单库性能达到极限,成为系统性能瓶颈点;
核心思想:增加从库,单点写入,多点读取(提升读性能)。目前主流方案都是走代理,比如阿里云的RDS,因为对用户完全透明,主从复制、主从切换,以及读写分离等工作由DBA来维护,如下图所示:

在这里插入图片描述
主从同步延时问题: 正常情况下,主从同步延时都是在1ms以内。但是,当网络抖动或者数据库负载过高时,主从延时可能会变大,导致主从数据出现暂时不一致的情况。这种问题有三种解决方案:

  1. 忽略。如果业务可接受暂时的延时,则直接忽略;
  2. 产品流程上规避,尽量避免写操作后立即查询最新数据的情况。比如,订单支付完成后,会跳出支付成功页,而不是自动跳转到订单页;
  3. 强制读主库。

3.3 垂直拆分

  随着业务发展,订单表字段越来越多,职责不清晰,维护麻烦。将相同功能的字段为一组进行拆分,职责清晰,容易维护和扩展。

3.4 数据归档/冷热分离

解决问题: 单库数据量过多导致读写性能下降(RT变高);
核心思想:利用订单“长尾效应”的特点,将历史数据迁移到其它库(冷库),为热库瘦身,从而提升性能,如下图所示:
在这里插入图片描述
注意点:

  1. 不要一次性删除大量数据(大事务,容易造成卡顿),建议按照主键顺序分批次批量删除;
  2. 这种方案需要产品设计上区分历史数据,比如前几年淘宝的“三个月前订单”选项;

3.5 分库分表

解决问题: 支持更高的并发量和数据量,解决单库性能和数据量的瓶颈;
核心思想: 数据分片,关键是分片key和分片算法。目前主流的方案有两种:路由表和哈希。

方案1:路由表

  路由表存储key与数据存储位置的映射关系, 每次查询数据时,先查询路由表获取数据位置,然后再查询数据,如下图所示。

  • 优点:分片灵活,可随意更改。比如,当出现热点分片时只需要更新路由表重新分片,当需要扩容时只需要增加路由信息。
  • 缺点:路由表为单表,且需要二次查询。
    在这里插入图片描述

方案2:哈希

  哈希算法本身很简单,在订单场景下需要考虑的是,分库分表的key是什么,如何同时满足用户侧和商家侧的查询需求。比如,如果按照订单id分库分表,用户的订单列表和商家的订单列表则需要全表扫描,用户id和商家id也是同理。
整体思路: 订单数据一式两份,分为用户库和商家库(只读)。对于用户库,按照订单id分库分表,用户id的某几位信息加入到订单id中(“因子分表法”,见订单号设计),同时满足用户id和订单id维度的查询;对于商家库,按照商家id对订单重哈希路由,如下图所示:

  • 建立单独的商家库,是为了物理上隔离商户查询对用户的影响;

  • 商家库只读是为了单点写入,方便维护数据的一致性;

  • 如果允许商家订单数据,则商家库只维护商家与订单的映射关系(路由表);
    在这里插入图片描述
    容量评估

  • 分库数量 = 峰值并发量 / 单库的IOPS;

  • 分表数量 = 数据量 / 单表容量(阿里Java开发规范的建议值:单表行数超过 500 万行或者单表容量超过 2GB);

四、MySQL + NoSQL架构

4.1 MySQL + ES

解决问题: 分库分表的查询能力有限,无法支持复杂灵活的查询;
核心思想: 引入ES,建立热点查询到订单ID的映射关系,用于支持复杂的查询条件。复杂查询通过ES获取对应的订单ID,再从数据库从库查询获得订单,如下图所示:
在这里插入图片描述
注意点

  1. 不要将订单及其扩展字段全量同步到ES,会影响检索效率,只同步有强搜索需求的字段;
  2. 建议将订单及其关联表聚合成一张宽表,提升ES查询时的效率;

4.2 MySQL + ES + HBase

解决问题: 解决订单详情查询时间长问题(需要去订单表及其关联表多次查询);
核心思想: 引入HBase,将订单及其关联表全量字段导入HBase,RowKey为订单id,如下图所示:
在这里插入图片描述

五、未来预期: NewSQL

  当前关系型数据库仍是主流的原因就在于其事务特性,NoSQL由于其高性能、高扩展和高存储量特性,成了目前技术方案的标配之一,以上所有的订单存储方案归纳起来就是MySQL + NoSQL的组合,未来NewSQL如果真正的能做到NewSQL = MySQL + NoSQL,订单的管理方案势必会被极大的简化,期待。

参考

  1. 淘宝服务端高并发分布式架构的十四次演进之路
  2. 阿里Java开发规范
  3. 有赞订单管理的三生三世与“十面埋伏”
  4. 基于Tablestore打造亿量级订单管理解决方案
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

订单系统设计 —— 订单管理 的相关文章

  • 【多目标跟踪论文阅读笔记——2021年CVPR论文粗读记录】

    阅读心得 多目标跟踪经典论文 2021CVPR论文粗读记录 前言 一 学习策略类 QDTrack 二 Temporal Spatial 类 TADAM Alpha Refine TraDes CorrTracker 三 Motion mod
  • 长大后会发现,学习其实就是因为自己想知道

    简单总结 01 习惯 看不懂的名词 第一时间google 02 注释 注释一些思路 把注释嵌入到工作和生活 像现在的记录 03 随记 关注身边的细节 及时回应别人 明白自己想说什么 选择好时机去说 04 务实方法 ETC Easier to
  • IDEA 设置为护眼的豆沙绿

    代码区域设置成护眼色 先打开 IDEA 的设置界面 然后按照下图按顺序店了设置就可以了 这个时候 可以看到 只有代码区域别成了护眼色 其他地方还是白的刺眼 我们来一个一个的解决掉 左侧的文件页修改为护眼色 还是先打开设置 然后如下图所示 先
  • 非对称加密工作原理

    非对称加密 非对称加密使用两个密钥 一个是public key 一个是private key 通过某个算法 使得数据的加密和解密使用不同的密钥 因为用的是不同的密钥 所以称为非对称加密 非对称加密最著名的是RSA算法 这是以其发明者Rive
  • java static变量_什么是静态(static)?什么是静态方法,静态变量,静态块和静态类...

    static是Java中的一个关键字 我们不能声明普通外层类或者包为静态的 static用于下面四种情况 静态变量 我们可以将类级别的变量声明为static 静态变量是属于类的 而不是属于类创建的对象或实例 因为静态变量被类的所有实例共用
  • Excel解决CSV文件中的乱码

    背景 对于CSV文件中的乱码问题 大概率是编码的问题 可以基于Excel进行编码转换 或将文本进行编码转化 解决办法 打开Excel应用 点击文件 新建文件 点击文件 选择导入 导入具体的CSV文件 选择CSV文件 点击完成即可 然后就可以
  • 麻雀算法(SSA)优化长短期记忆神经网络的数据分类预测,SSA-LSTM分类预测,多输入单输出模型

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 读取数据 res xlsread 数据集 xlsx num res size res 1 样本数 每一行 是一
  • vue + css气泡图动态气泡图

    div ul class bubbleUl li class bubbleLi div class textBubble span item value span div div class topDiv div style width 1
  • 从一个类调用另一个类的方法或属性

    package 练习 class yu String m 人工小智能 public void shout1 System out println 我是 m 今年18岁 同类中直接调用了m public void shout2 yu p ne
  • grep指令详解

    shell grep指令详解 grep 参数 e 使用PATTERN作为模式 这可以用于指定多个搜索模式 或保护以连字符 开头的图案 指定字符串做为查找文件内容的样式 f 指定规则文件 其内容含有一个或多个规则样式 让grep查找符合规则条
  • 【SQL注入】堆叠注入

    目录 一 简介 概述 原理 优势 前提 防护 二 分析堆叠注入 使用MYSQL 第一步 使用堆叠查询构造多条语句 第二步 查看语句是否成功执行 第三步 删除test 再查询 第四步 执行其它查询语句 一 简介 概述 顾名思义 就是多条语句堆
  • 【电脑使用】chm文件打开显示确保Web地址 //ieframe.dll/dnserrordiagoff.htm#正确

    问题描述 最近找到一个之前的一个chm文件 打开的时候内容是空白的 同时报错 确保Web地址 ieframe dll dnserrordiagoff htm 正确 如下图所示 参考链接 解决方案 根据文章中提示的方法 找到了原因所在 chm
  • 详解微信小程序支付流程

    小程序微信支付图 微信小程序的商户系统一般是以接口的形式开发的 小程序通过调用与后端约定好的接口进行参数的传递以及数据的接收 在小程序支付这块 还需要跟微信服务器进行交互 过程大致是这样的 一 小程序调用登录接口获取code 传递给商户服务
  • linux传输文件指令

    使用scp传输 从本地传到服务器 scp P 目的端口 本地路径 目的用户名 目的IP 目的路径 r参数可用来传文件夹 scp r P 使用sftp传输 sftp oPort 目的端口号 目的用户名 目的IP get下载 put上传
  • 这5个开源和免费静态代码分析工具,你一个都没有用过吗?不会吧

    如果您是软件开发人员或代码安全分析师 则通常需要分析源代码以检测安全漏洞并维护安全的质量代码 但是您的代码中可能存在许多难以手动发现的问题 毕竟 我们仍然是人类 因此即使是最高级的安全分析师也都会错过一些安全漏洞 我们提供了源代码分析工具功
  • MySql中4种批量更新的方法

    MySql中4种批量更新的方法 mysql 批量更新共有以下四种办法1 replace into 批量更新 replace into test tbl id dr values 1 2 2 3 x y 例子 replace into boo
  • 人生顿悟之宽以待人,严以律己

    台风已经过去了 天气也渐渐地晴朗了 但是不知道为什么自己的心情却越发觉得沉重起来 总觉得生活中少了点什么 是没有了以往的激情 还是多了几分压力 看了近1个月的房子 两个人的所有积蓄加上两家人的积蓄 勉强可以付得起首付 接下去就是了无止境的房

随机推荐

  • 开启MySQL主从半同步复制

    记录配置mysql主从半同步复制的过程 加载lib 所有主从节点都要配置 主库 install plugin rpl semi sync master soname semisync master so 从库 install plugin
  • Android Studio从一个activity到另一个activity

    Android Studio从一个activity跳转到另一个activity 简单的跳转 创建两个activity 创建跳转按钮 在第一个activity的onCreate中添加按钮监听事件 编写内部类 button setOnClick
  • [网盘工具/百度网盘]秒传链接的使用 -2022版油猴网页脚本

    注 此项技术仅针对百度网盘有效 软件要求 Chrome或Firefox等支持tampermonkey Violentmonkey的浏览器 1 什么是秒传链接 度盘秒传链接 标准提取码 由128位 32个16进制数 128位 32个16进制数
  • Neon intrinsics

    1 介绍 在上篇中 介绍了ARM的Neon 本篇主要介绍Neon intrinsics的函数用法 也就是assembly之前的用法 NEON指令是从Armv7架构开始引入的SIMD指令 其共有16个128位寄存器 发展到最新的Arm64架构
  • mysql设置wait timeout_mysql修改wait_timeout_MySQL

    bitsCN com mysql修改wait timeout mysql mysql gt show global variables like wait timeout 其默认值为8小时 mysql的一个connection空闲时间超过8
  • TypeScript中类的继承

    特点 避免重复创建类 减少代码数量 通过extends关键字继承父类 通过super继承父类的属性和方法 实例 class Person1 定义属性 name string age number gender string construc
  • transformer序列预测示例

    本文参考 python量化 将Transformer模型用于股票价格预测 蚂蚁爱Python的博客 CSDN博客 transformer 股票 一 Transformer初步架构图 二 transformer各组件信息 1 position
  • Maven执行mvn clean compile命令遇到Fatal error compiling: 无效的标记: --release错误解决办法

    Maven执行mvn clean compile命令会报如下图所示的错误 由图可知 maven compiler plugin插件编译时用到了 release选项 而我的jdk是1 8 不支持该选项 此时我的maven compiler p
  • linux学成之路(基础篇(二十三)MySQL服务(中)

    目录 MySQL服务之SQL语句 一 SQL语句类型 一 DDL语句 二 DML语句 三 DCL语句 四 DQL 语句 二 数据库操作 一 查看 二 创建 三 进入 四 删除数据库 五 更改数据库名称 六 更改字符集 三 数据表管理 一 数
  • Hadoop HDFS shell 命令行常用操作

    前言 Hadoop HDFS shell的命令和Linux的shell命令有类似的地方 基本上会使用Linux命令的话 把HDFS的理论理解一下就可以了 一 创建文件夹 hadoop fs mkdir p
  • 【915程序设计】21西交大软件专硕915程序设计真题讲解

    28 马鞍点 include
  • 【华为OD机试c++】Excel单元格数值统计【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 Excel 工作表中对选定区域的数值进行统计的功能非常实用 仿照Excel的这个功能 请对给定表格中选中区域中的单元格进行求和统计 并输出统计结
  • Halide学习笔记---Halide语言设计的初衷

    Halide语言设计初衷 我们正处于一个数据密集的时代 4D广场相机 图形渲染 3D打印 图像传感器 高质量医学图像等 每天生产大量的图像数据 面对这样一个图像时代 急需要针对图像处理算法设计的高性能图像处理编程语言 在这样的需求下 Hal
  • 第五届蓝桥杯——java c组 1/a 的分数称为单位分数

    形如 1 a 的分数称为单位分数 可以把1分解为若干个互不相同的单位分数之和 例如 1 1 2 1 3 1 9 1 18 1 1 2 1 3 1 10 1 15 1 1 3 1 5 1 7 1 9 1 11 1 15 1 35 1 45 1
  • 一文读懂 React16.0-16.6 新特性(实践 思考)

    首先 把我知道从16 0开始到现在为止新特性全部列举出来 v16 0 render 支持返回数组和字符串 createPortal 支持自定义 DOM 属性 Error Boundary Fiber SSR优化 减少文件体积v16 1 re
  • 对区块链钱包的简单认识

    钱包是存储和使用数字货币的工具 在区块链领域有举足轻重的地位 在对钱包分类之前 需要先理解几个概念 钱包地址 它类似于银行卡号 一个人可以拥有多张银行卡 所以他也可以拥有多个钱包地址 一个钱包地址只能对应一个私钥 在一个钱包中 可以拥有多个
  • VMware导入别人的虚拟机

    根据老师发的文件 将分卷压缩文件下载到一个文件夹中 选择解压第一个文件 即可得到所有资源 可以看出得到如下文件 这里需要导入Vmware中 我查询了几种导入的方法 1 导入OVF 首先选择导入ovf文件 直接点击打开虚拟机 选择导入Ubun
  • Go 每日一库之 cobra

    简介 cobra是一个命令行程序库 可以用来编写命令行程序 同时 它也提供了一个脚手架 用于生成基于 cobra 的应用程序框架 非常多知名的开源项目使用了 cobra 库构建命令行 如Kubernetes Hugo etcd等等等等 本文
  • $('#dg').datagrid('getSelections');", 得到的rows.length在多选情况下总为1, 不选择时为0.

    dg datagrid getSelections 得到的rows length在多选情况下总为1 不选择时为0 方案 title ID field dataId width 80 hidden true 的field一定要与idField
  • 订单系统设计 —— 订单管理

    文章目录 一 方案背景 1 1 考虑因素 1 2 数据特点 二 方案演进 三 MySQL架构 3 1 单库单表 3 2 读写分离 3 3 垂直拆分 3 4 数据归档 冷热分离 3 5 分库分表 方案1 路由表 方案2 哈希 四 MySQL