伙伴云客服论坛»论坛 S区 S客户管理 查看内容

0 评论

0 收藏

分享

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

文章目录

    一、方案背景
      1.1 考虑因素1.2 数据特点
    二、方案演进三、MySQL架构
      3.1 单库单表3.2 读写分别3.3 垂直拆分3.4 数据归档/冷热分别3.5 分库分表
        方案1:路由表方案2:哈希

    四、MySQL + NoSQL架构
      4.1 MySQL + ES4.2 MySQL + ES + HBase
    五、将来预期: NewSQL


一、方案背景

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

    数据量: 订单的特点是只增不减,随着时间推移,订单量会越来越多;
    多维查询分析: 可以灵敏的支持不同角色用户多种维护的查询和分析;

    订单系统设计 —— 订单管理-1.jpg


    性能: 订单管理效劳需要只能高并发、低延迟;
1.2 数据特点

  订单数据具有明显的时间属性,主要呈现出两个特点:
    特点1:时间越久的订单被访问到的概率越低;特点2:订单规模随着时间推移不时变大,GB、TB,甚至PB等;

    订单系统设计 —— 订单管理-2.jpg


二、方案演进

  技术架构不是设计出来的,是演化出来的。订单管理方案也是随着业务和技术的开展,不时演化的,如下图所示。依照技术架构特点,大致分为三类:
    MySQL架构:通过扩展库表数量来提升读写才干和存储容量;MySQL + NoSQL架构:MySQL提供事务才干,NoSQL保证海量数据的存储和多维查询分析才干;NewSQL架构:期待成熟的产品呈现,兼容MySQL、NoSQL二者优势;

    订单系统设计 —— 订单管理-3.jpg

说明:订单是个性化的数据,每个用户的订单数据都不同,不适宜使用缓存;
三、MySQL架构

3.1 单库单表

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

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

主从同步延时问题: 正常情况下,主从同步延时都是在1ms以内。但是,当网络抖动或者数据库负载过高时,主从延时可能会变大,导致主从数据呈现暂时不一致的情况。这种问题有三种处置方案:
    忽略。假设业务可接受暂时的延时,则直接忽略;产品流程上躲避,尽量防止写操作后立即查询最新数据的情况。比如,订单支付完成后,会跳出支付胜利页,而不是自动跳转到订单页;强迫读主库。
3.3 垂直拆分

  随着业务开展,订单表字段越来越多,职责不明晰,维护费事。将相同功能的字段为一组停止拆分,职责明晰,容易维护和扩展。
3.4 数据归档/冷热分别

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

订单系统设计 —— 订单管理-5.jpg

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

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

  路由表存储key与数据存储位置的映射关系, 每次查询数据时,先查询路由表获取数据位置,然后再查询数据,如下图所示。
    优点:分片灵敏,可随意更改。比如,当呈现热点分片时只需要更新路由表重新分片,当需要扩容时只需要增加路由信息。缺点:路由表为单表,且需要二次查询。

    订单系统设计 —— 订单管理-6.jpg

方案2:哈希

  哈希算法自身很简单,在订单场景下需要考虑的是,分库分表的key是什么,如何同时满足用户侧和商家侧的查询需求。比如,假设依照订单id分库分表,用户的订单列表和商家的订单列表则需要全表扫描,用户id和商家id也是同理。
整体思路: 订单数据一式两份,分为用户库和商家库(只读)。对于用户库,依照订单id分库分表,用户id的某几位信息参与到订单id中(“因子分表法”,见订单号设计),同时满足用户id和订单id维度的查询;对于商家库,依照商家id对订单重哈希路由,如下图所示:
    建立单独的商家库,是为了物理上隔离商户查询对用户的影响;
    商家库只读是为了单点写入,方便维护数据的一致性;
    假设允许商家订单数据,则商家库只维护商家与订单的映射关系(路由表);

    订单系统设计 —— 订单管理-7.jpg

    容量评估
    分库数量 = 峰值并发量 / 单库的IOPS;
    分表数量 = 数据量 / 单表容量(阿里Java开发规范的建议值:单表行数超越 500 万行或者单表容量超越 2GB);

四、MySQL + NoSQL架构

4.1 MySQL + ES

处置问题: 分库分表的查询才干有限,无法支持复杂灵敏的查询;
核心思想: 引入ES,建立热点查询到订单ID的映射关系,用于支持复杂的查询条件。复杂查询通过ES获取对应的订单ID,再从数据库从库查询获得订单,如下图所示:

订单系统设计 —— 订单管理-8.jpg

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

处置问题: 处置订单详情查询时间长问题(需要去订单表及其关联表屡次查询);
核心思想: 引入HBase,将订单及其关联表全量字段导入HBase,RowKey为订单id,如下图所示:

订单系统设计 —— 订单管理-9.jpg


五、将来预期: NewSQL

  当前关系型数据库仍是主流的原因就在于其事务特性,NoSQL由于其高性能、高扩展和高存储量特性,成了目前技术方案的标配之一,以上所有的订单存储方案归纳起来就是MySQL + NoSQL的组合,将来NewSQL假设真正的能做到NewSQL = MySQL + NoSQL,订单的管理方案势必会被极大的简化,期待。
参考
    淘宝效劳端高并发分布式架构的十四次演进之路阿里Java开发规范有赞订单管理的三生三世与“十面埋伏”基于Tablestore打造亿量级订单管理处置方案

回复

举报 使用道具

相关帖子
全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

疯就要疯的够特
注册会员
主题 14
回复 21
粉丝 0
|网站地图
快速回复 返回顶部 返回列表