背景

在电商交易中台团队工作了一段时间,越发觉自己需要学习的东西还有很多,因此想要定期整理、反思一下所见、所想,因此先从接触的订单中心开始。

订单是什么,我所理解,订单就是交易行为的记录。是用户某一刻在平台上购买的凭证,订单当时对应的商品、优惠等信息是不可更改的。换一种说法就是订单是交易行为的快照。在按下”快门“(下单)的一刻,所有信息都被锁定了。

订单在公司业务中也是起一个大上下文的作用,保存着完整的元数据,下游需要时自取。因此对订单的设计注定是更加看重扩展性的。不然每来一个新的业务,都需要通过加字段或者和产品说这个需求做不了,那就证明订单的设计还有待提升。

目标

订单中心要能搭载整个电商平台的订单,使用统一、稳定的模型支撑不同的业务。提供稳定、可靠、原子的订单api服务。

模型设计说明

订单模型该怎么设计?订单模型该考虑哪些点?订单表该有哪些字段?

订单表的设计不是腾空降下来的,每个点、每个字段都应该是有凭有据的。

三级订单

订单联系着这么多领域,不同领域关心的订单维度不一样,如何更好的服务着各个领域呢?

为了订单引入了三级订单模型:

支付级订单(L1订单)、店铺级订单(L2订单)、商品级订单(L3订单)。

支付级:L1订单,对应的用户付款,也就是合并支付单,用户的一次交易行为实付款就在这边,平台级的优惠也记录在此。

店铺级:L2订单,对应店铺,下单按照店铺的维度拆分而得,也是c端用户可见的订单,店铺级优惠、运费记录在此。(仔细看看京东、淘宝都不是都是按照此维度拆单的)

商品级:L3订单,对应商品,下单按照sku的维度拆分而得,商品级优惠记录在此。

三级订单之间通过”父子”的方式相互关联,店铺级订单的父订单是支付级,商品级订单的父订单是店铺级。

支付级 1:n 店铺级 1:n 商品级

三个维度的订单,其实大部分字段是相同的,因此就不创建三张表,而是合并在一个订单中,通过level区分到底是哪一级订单。

订单模型详细设计

那么支撑电商平台全业务的订单表主要包含哪些字段呢?我使用脑图的方式列几个大概点

这个多信息,订单都要记,订单表那得有多少字段啊?

仔细分析,非也。有很多数据是无需作为单独字段存储在订单主表的,就比如商品、店铺的完整快照,作用只是为了留存,完全没有必要放在主表中。

一些平常偶有查询需求的信息,可以放在订单的扩展字段中,使用大json保存,方便扩展,可读性也好。

不过排除了这些”冷“字段后,订单表还是有很多字段,毕竟是要作为订单中心支撑电商全业务,字段比一般业务的表要多,也无可厚非了。

容量规划

目标是支持平台未来n年的发展,因此分库分表是必须的,按照电商数据的使用场景维度,划分为买家库、卖家库是最为常见的。

买家库,顾名思义,根据买家id作为分片键路由到某一分表,但订单号作为订单表的”硬通货“,其使用场景比买家id还要多。因此订单表的分片键需要有两个(买家id和订单id是或的关系)。一次sql操作条件必须包含买家id或订单id,两个分片键怎么保证路由到同一分表呢?数据一样,路由算法一样,那么肯定会路由到同一分表,因此想到在订单号中添加用户id就是一个可行的方案。路由函数用最简单的分片键取模分片数。根据分片的数量来计算出订单号中冗余买家id的位数,比如我需要分256片,那么订单号末尾增加用户id的后三位即可。

什么,你问我有支持这种两个分片键的分库分表中间件吗?阿里云drds奉上 阿里云drds,range_hash拆分函数。

什么,你问我有免费的吗?sharding-jdbc 改造下路由策略即可,我司就是之前用的drds,后来迁移至自研sharding-jdbc上。

差点忘了,还有卖家库。想象一下,如果我们是下单系统在下单时不仅要插入买家库,还有卖家库,那下单接口的tps就会严重受限,why?创建订单本就是一个很重的操作,两个很重的sql执行,又慢,大促时还增加了数据库抖动造成下单失败的概率。

我们仔细分析下场景,买家库服务于c端用户,数据实时性要求高,我下了一单,去订单列表结果发现没有?那问题就严重了。

但用户下了一单,卖家在后台列表短时间没看到,这是完全可以接受的,卖家是为了发货,就算实时看到,也不能立马发货。

因此在卖家库数据的产生上,我们使用异步的方式优化。

主要方案是,监听买家库的binlog,插入到卖家库中。卖家库不允许直接修改,完全由binlog保障与买家库的一致性。

方案的优势:提升了下单接口的性能,使用binlog + 消息解耦了卖家库数据的产生。

方案的弊端:一致性不能完全保障,后续需要对账系统进行严格保障。大促数据量大,卖家库可能会有较大的延时。

总结

我认为电商订单中心要想设计的”好“,首先对电商全链路业务必须有一定的了解,不然可能考虑点会欠缺一点,还可能会产生一些额外的过度设计。建立稳定的数据模型与业务模型,系统可以慢慢不断实践、总结、优化,最终朝着目标慢慢迭代。

电商交易之订单中心设计(一)相关推荐

  1. 电商交易之订单中心设计(二)

    背景 上篇说过订单基础设计,介绍了订单中心应该有哪些能力,大概有哪些字段,还有容量上的处理.上篇有点像在讲订单的数据模型,这篇来看看订单的业务模型. 价格模型 订单的价格怎么计算得来?普通电商平台用户 ...

  2. vue+elemenUI项目,仿照京东商城,完成电商网站的订单中心

    效果展示: 页面布局 <el-tabs class="orders"><el-menu default-active="1" class=&q ...

  3. 电商系统:订单实体设计、数据库表设计

    UserOrder(客户订单表): 参数 参数注释 类型 是否非空 示例 说明 oder_code 订单号 string Y 12022110102481315119 order_username 所 ...

  4. Axure电商后台业务管理系统原型模板/通用版电商后台管理系统/订单管理/营销管理/运营管理/财务管理/统计分析/库存管理/流量统计/运营管理/用户管理/秒杀促销/交易统计/活动管理/广告管理

    Axure电商后台业务管理系统原型模板/通用版电商后台管理系统/订单管理/营销管理/运营管理/财务管理/统计分析/库存管理/流量统计/运营管理/用户管理/秒杀促销/交易统计/活动管理/广告管理 作品名 ...

  5. 架构设计 | 基于电商交易流程,图解TCC事务分段提交

    本文源码:GitHub·点这里 || GitEE·点这里 一.场景案例简介 1.场景描述 分布式事务在业务系统中是十分常见的,最经典的场景就是电商架构中的交易业务,如图: 客户端通过请求订单服务,执行 ...

  6. 一线电商公司的订单系统是如何进行数据库设计的?

    一般互联网公司的订单系统是如何做分库分表的,既然要聊订单系统的分库分表,那么就得先说说为什么订单需要分库分表,其实最关键的一点就是要分析一下订单系统的数据量,那么订单系统的数据量有多大?这个就得看具体 ...

  7. (九十八)大白话一线电商公司的订单系统是如何进行数据库设计的?

    今天我们来给大家讲讲第二个案例拓展,也就是一般互联网公司的订单系统是如何做分库分表的,既然要聊订单系统的分库分表,那么就得先说说为什么订单需要分库分表,其实最关键的一点就是要分析一下订单系统的数据量, ...

  8. 电商平台的订单设计流程

    一.主流电商产品的订单状态 淘宝的订单状态主要有待付款.待发货.待收货.待评价.已关闭.以及退款中. 京东的订单状态主要有待付款.待收货.已完成.已取消等. 有赞的订单状态主要有待付款.待接单.待发货 ...

  9. 依赖治理、灰度发布、故障演练,阿里电商故障演练系统的设计与实战经验

    2019独角兽企业重金招聘Python工程师标准>>> 2016 年,阿里巴巴研发了故障演练系统,把故障以场景化的方式沉淀到系统中,在线上主动回放故障,验证监控报警.限流降级.故障迁 ...

最新文章

  1. 这么流行的ZooKeeper,原来是这样设计的!
  2. 【Azure Services Platform Step by Step-第1篇】INTRODUCING THE AZURE SERVICES PLATFORM
  3. nginx lua调用redis和mongo
  4. CodeForces - 1353F Decreasing Heights(dp)
  5. Thinkpad F2不能进行重命名的问题
  6. 常用网络命令使用技巧详解续编1
  7. 04.卷积神经网络 W3.目标检测
  8. Java中的queue和deque对比详解
  9. 单片机编程软件很简单(16),Keil单片机编程软件建立工程项目
  10. 高强度聚焦超声系统市场现状及未来发展趋势
  11. 人脸关键点检测——dlib
  12. 合成孔径雷达影像(SAR图像)变化检测深度学习研究方法
  13. 淘宝店如何加入全屏轮播图片
  14. 2021年3月最新-李沐-动手学深度学习第二版-中、英文版
  15. 百度AI—人脸在线比对
  16. 微信小程序开发—(八)canvas绘制图形
  17. SVN修改提交后的文件名
  18. 启动Mysql时报错:mysqld_safe mysqld from pid file /usr/local/mysql/data/Linux.pid ended
  19. 广义势能函数和带电粒子在电磁场中的运动
  20. MySQL提示:The server quit without updating PID file问题的解决办法

热门文章

  1. 1.通过PADS Logic创建原件类型和逻辑封装
  2. Qt-c++桌面编程报错:qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in
  3. 三井住友銀行相关资料
  4. Cookie 和 Session、实现用户登录逻辑
  5. 看全新升级的KubeSphere 3.0 如何助力企业在容器混合云时代乘风破浪?
  6. 台风康妮超级计算机,台风康妮最新消息 2013年第15号台风康妮实时路径图
  7. 第917期机器学习日报(2017-03-23)
  8. ELLE风尚大典暨全球75周年庆典在成都环球中心举办
  9. springboot中ElasticSearch入门与进阶:组合查询、聚合查询
  10. 什么是DC / AC / OC 机房?