基于DTS+Tablestore的海量订单系统架构设计

订单系统概述

订单场景是人们高频接触的一类场景,无论是线下商场购物、吃喝玩乐消费,还是线上淘宝、会员充值、外卖预定。只要涉及人就会有交易,只要有交易就会产生订单。毫不夸张的讲,所有的应用都会涉及到支付与订单的管理,因此,完善的订单管理架构是每一个架构师或开发人员都要直面的挑战。

对于订单系统,保证事务与强一致是前提,架构师们通常都会选择MySQL等TP型数据库。但是遇到大规模数据场景下也不得不面临一定的问题。首先,需要通过分库分表等方式提供一个分布式能力提升数据库数据存储、吞吐量,其次数据量大对于查询与聚合等需求难以支持,严重会影响表服务能力与性能。但是在大规模数据下,订单的多维检索、订单分析、以及周期性报表等需求,也是不能够舍弃的。因此需要一个历史订单库,将订单数据派生到其他存储引擎,从而拓展数据的查询、分析、聚合等能力。

这时,用户会考虑数据双写、数据同步等方式将数据派生一份到搜索引擎或其他NoSQL分布式数据存储,来扩展MySQL性能成本非常高的使用场景。多写的方案一般很少,这对写入一致性项目运维成本与写入性能会有很大的挑战。当前,更被大众所接受的是基于TP数据库的binlog订阅做数据同步,虽然数据同步上会有延时(通常秒级别甚至更低),但是在运维成本、能力扩展、数据一致性上表现优异。

DTS+Tablestore方案

本文主要介绍一套基于DTS与Tablestore实现一套完善的订单系统架构。实时订单数据主要针对用户侧的实时生产与修改,实例订单数据则是基于数据同步服务DTS,全、增量订阅TP库中的订单数据,从而保证Tablestore中数据与TP库数据的最终一致性。异步同步的方式不可避免的存在延时,但历史订单库在实时性上要求会适当放宽,但其派生出来的数据在服务能力与功能扩展上得到了极大的提升,尤其是Tablestore这种分布式服务能力强、下游计算生态丰富的NoSQL存储服务。

系统架构设计

系统架构如下图,架构基于订单数据的使用功能与实时性分两部分:实时在线订单数据与历史订单数据。

  • • 在线订单数据:存储在TP型数据库,如MySQL、PolarDB等,用于保证订单的强事务能力;
  • • 历史订单数据:存储在Tablestore,分布式存储,支持多维检索与聚合能力,拥有完善的大数据生态;
  • • 同步链路:DTS(数据传输服务),支持全量数据迁移与实时数据同步,实时同步延时秒级别;
    基于DTS+Tablestore的海量订单系统架构设计

Tablestore的能力与生态

Tablestore的服务性能、分析查询能力以及下游生态,值得着重强调,丰富的能力扩展正是数据派生的核心价值。这里主要展示多元索引、大数据生态两个亮点,更多Tablestore场景与功能,请参考《表格存储Tablestore权威指南》

  • • 多元索引:
    基于倒排索引和列式存储,可以解决大数据的复杂查询难题,包括非主键列查询、全文检索、前缀查询、模糊查询、多字段*组合查询、嵌套查询、地理位置查询等功能。适用于元数据管理、历史订单维护、地理围栏等场景。

深入了解多元索引:多元索引官网文档、《TableStore发布多元索引功能,打造统一的在线数据平台》

  • • 大数据架构
    Tablestore 作为一款高性能低成本的存储引擎,海量的数据存储伴随的就是大数据生态对接,并已经形成了一套稳定、高性能的大数据架构,产品在核心功能的升级迭代的过程中,也不断的加强计算引擎对接,目前已经对接了阿里云几个核心计算引擎,包含:MaxCompute、EMR Spark、Blink、DLA 、FC,更总结出一套流批一体处理框架(Lambda plus)。

深入了解数据中台、大数据体系:《数据中台之结构化大数据存储设计》、《基于 Tablestore 的大数据分析 Lambda 架构 - 云原生、弹性、流批一体》
架构搭建实战

准备工作

1、服务准备

  • • 开通RDS服务:并购买MySQL实例,此处不做详细介绍,可参考《文档》;
  • • 开通Tablestore服务:创建实例(免费),不做详细介绍,可参考《文档》;
  • • 开通DTS服务:并购买MySQL同步Tablestore实例
    目前仅上线MySQL、PolarDB到Tablestore,其中PolarDb需要主动开启binlog开关才能支持增量同步。Tablestore暂时开发上海、北京、深圳,本例使用上海实例。

基于DTS+Tablestore的海量订单系统架构设计

2、资源准备

创建子账号AccessKey

并对子账号实例级别授权,权限为操作Tablestore资源权限,让DTS有权限操作用户该实例资源(注意region跟实例名)

  • • 创建子账号
    基于DTS+Tablestore的海量订单系统架构设计
  • • Tablestore实例授权
{
    "Version": "1",
    "Statement": [
        {
            "Action": "ots:*",
            "Resource": "acs:ots:[myInstanceRegion]:*:instance/[myInstanceName]/*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ots:ListInstance",
                "ots:GetInstance"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

建表语句

/******************************************/
/*   DatabaseName = dts_demo   */
/*   TableName = order_contract   */
/******************************************/
CREATE TABLE `order_contract` (
  `oId` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单id',
  `createTime` datetime NOT NULL COMMENT '下单时间',
  `payTime` datetime DEFAULT NULL COMMENT '支付时间',
  `hasPaid` tinyint(1) NOT NULL COMMENT '是否支付',
  `cId` varchar(20) NOT NULL COMMENT '消费者id',
  `cName` varchar(20) NOT NULL COMMENT '消费者姓名',
  `pBrand` tinytext NOT NULL COMMENT '产品品牌',
  `pCount` mediumint(10) NOT NULL COMMENT '产品数量',
  `pId` varchar(20) NOT NULL COMMENT '产品id',
  `pName` varchar(20) NOT NULL COMMENT '产品名',
  `pPrice` decimal(10,2) NOT NULL COMMENT '产品价格',
  `sId` varchar(20) NOT NULL COMMENT '售货员id',
  `sName` varchar(20) NOT NULL COMMENT '售货员姓名',
  `totalPrice` decimal(10,2) NOT NULL COMMENT '总价格',
  PRIMARY KEY (`oId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='在线订单表';

用户下单

直接通过sql写入,模拟用户下单与应用订单数据写入

INSERT INTO order_contract (oId, payTime, createTime, hasPaid, cId, cName, pBrand, pCount, pId, pName, pPrice, sId, sName, totalPrice)
VALUES 
("00000001", null, "2020-08-05 11:11:11", false, "c00001", "消费者1", "iphone", 1, "p00001", "iphone 7 plus",  9999.80, "s00001", "售货员1", 9999.80),
("00000002", null, "2020-08-05 12:11:11", false, "c00001", "消费者1", "iphone", 1, "p00002", "iphone 8 plus",  10999.80, "s00001", "售货员1", 10999.80),
("00000003", null, "2020-08-05 13:11:11", false, "c00002", "消费者2", "小米", 2, "p00010", "小米 7 plus",  999.81, "s00001", "售货员1", 1999.62);

同步配置

  • • 配置DTS实例
    基于DTS+Tablestore的海量订单系统架构设计
  • • 配置目标、源配置
    基于DTS+Tablestore的海量订单系统架构设计
  • • 配置同步表、字段与类型转换
    基于DTS+Tablestore的海量订单系统架构设计

字段类型映射不建议全部选用默认,根据需求做定制,其中Boolean在MySQL中表现为tinyint(1),需要主动设置成Boolean,时间默认使用String如需转换为时间戳,目标类型主动配置成Integer类型。
基于DTS+Tablestore的海量订单系统架构设计

启动任务

启动并进入预检

基于DTS+Tablestore的海量订单系统架构设计
基于DTS+Tablestore的海量订单系统架构设计

预检完成会自动进入结构迁移(初始化建表)、全量迁移、增量同步阶段。然后用户可以基于DTS控制台查看结构迁移与同步状态。

目标检查

结构迁移

结构迁移完成,Tablestore实例下表初始化成功,主键符合预期
基于DTS+Tablestore的海量订单系统架构设计

存量数据

进入存量阶段,开始同步MySQL库已有数据,同步成功后目标库数据可见。
基于DTS+Tablestore的海量订单系统架构设计

增量校验

使用样例中的SQL模拟下单、更新订单、删除订单等操作,观察Tablestore实例中表的数据变化

下单

INSERT INTO order_contract (oId, payTime, createTime, hasPaid, cId, cName, pBrand, pCount, pId, pName, pPrice, sId, sName, totalPrice)
VALUES ("00000004", null, "2020-08-05 11:11:11", false, "c00003", "消费者3", "iphone", 1, "p00001", "iphone 7 plus",  9999.80, "s00001", "售货员1", 9999.80);

支付修改订单状态

update order_contract set payTime = "2020-08-05 21:11:11", hasPaid = true WHERE oId = "00000004";

删除数据

DELETE FROM order_contract WHERE oId = "00000004";

扩展能力

多元索引聚合查询

多元索引对于历史订单的管理,我们曾给出过最佳实践,用户可以参考《基于Tablestore打造亿量级订单管理解决方案》与控制台样例了解功能使用的详细方案。您只需在Tablestore相应的表中直接创建多元索引,便可完成历史订单数据的多条件组合查询、模糊查询、地理位置查询、存在性查询、简单的统计聚合与分析等。通过对产品名做分词,支持模糊查询能力,实例中查询"iphone"关键字,会从全量订单数据中检索出相应的2行数据。
基于DTS+Tablestore的海量订单系统架构设计

多元索引的订单实战样例,可以参考文章《基于Tablestore打造亿量级订单管理解决方案》,并提供了直观感受的demo样例,如下图。用户可以参考借鉴。

基于DTS+Tablestore的海量订单系统架构设计

除了多维组合查询,多元索引还是统计、聚合的能力,该能力没有在控制台上暴露,需要通过sdk使用,这里暂不距离,具体使用,可以参考《文档:多元索引的统计聚合》。
使用统计聚合功能可以实现求最小值、求最大值、求和、求平均值、统计行数、去重统计行数、按字段值分组、按范围分组、按地理位置分组、按过滤条件分组、嵌套查询等;同时多个统计聚合功能可以组合使用,满足复杂的查询需求。

流批一体的电商大屏

订单对于电商场景的最根本数据源,如何让海量的订单数据易分析、易可视化是场景的重要需求点,电商大屏或周期交易报表是最直接的数据价值挖掘的方式。这里以大屏为例,大屏可以包含全量订单、实时订单的聚合,全量订单的聚合提供的是全景的综合数据视图,而实时订单的聚合展示的是实时的运营指标数据。
谈完流批计算对数据价值挖掘的作用,就要见一下实现。Tablestore已经拥有较多的实战案例与架构文章,这里不做重复输出,用户可以直接前往文章《Tablestore结合Spark的流批一体SQL实战》,了解构建方案与效果。大屏效果如下图。
基于DTS+Tablestore的海量订单系统架构设计

免费专家服务

欢迎加入Tablestore社区了解产品或参与讨论,更多文章欢迎前往《表格存储Tablestore权威指南》。
表格存储 (Tablestore) 提供专业的免费的技术咨询服务,期待您的加入。群号 : 23307953
基于DTS+Tablestore的海量订单系统架构设计

上一篇:算法的时间复杂度(计算实例)


下一篇:基于Tablestore的一站式物联网存储解决方案-场景篇