(项目随笔)关于订单系统的思考

订单系统几个特点:

1、历史信息多(每一条订单完成后,生成一条历史信息,并且一般情况下,久远的订单信息不回被经常查看)

2、并发量高(特别是秒杀系统生成的订单,每秒会有成百上千条订单)

3、订单id必须全局唯一

一、分库分表

随着订单量的增加,数据库发展如下:

  • 单一的数据库
  • 一主一从
  • 双主多从,读写分离
  • 分表分库,提高并发

已知Mysql单表性能超过千万级别会严重下降,按照千万级别来计算,假设订单系统分为16个库,每个库64个表进行存储,共1024个表,那么,Mysql最高可以存储百亿级别的订单。随着储存问题的解决,复杂度也会随之增加,例如一下问题:

  • 多库多表,如何保证订单编号唯一
  • 查询复杂度增加,怎么解决(不知道数据具体在哪个表中)
  • 买家查看订单在哪里查,卖家查看订单在哪里查
  • 再大的储存量,随着数据的增长,总会遇到瓶颈,应该怎么扩容

下面依次解决上面的问题:

1、生成全局唯一的订单编号

这里采用了:机器ID+时间戳+自增序列(+userid后两位); 

这里的机器id是因为集群部署的时候,不同机器上的订单系统的机器id是不一样的,生成的订单id也就不一样了。

时间戳可以精确到毫秒,但是如果每毫秒任然有并发,单纯使用时间戳并不能完全生成唯一订单id

自增序列每个表自己的自增序列,保证单表的订单id唯一

userid后两位,给订单id赋予一定含义。

详情可见:分布式系统唯一ID生成方案汇总

 

2、查询复杂度的降低-----mycat数据库中间件

中间价可以使用阿里的mycat连接,具体使用查看mycat文档。优点:代码实现简单,跟分库前差不多。

而直接使用jdbc链接,需要自己计算哪条订单存入哪个库,优点是:直接链接数据库性能更好,缺点是代码复杂度高。

 

3、买家卖家订单设计

由于买家与卖家有不同的查询特性,买家(用户)只会查询自己的订单,而卖家(商家)会查询自己店铺的订单,还有管理者,他可以查询所有的订单并且统计。

订单的查询特性是:一般三个月之前的订单是很少被查询的。

所以我这里设计了两个订单表,一个是针对用户的,一个是针对商家和管理者的。

用户订单表UOrderId根据订单的后两位(也就是生成订单id时的用户id后两位),进行分库分表,这样分得的订单表中,同一个用户的订单一定是在一个表中的,使用mycat查询的时候,减少了mycat的计算等的操作。

商家订单表OOrderId根据订单产生的时间进行分库分表,我们按照一个月一个月分表,分为12个表,商家和管理者查询这个表,由于经常查看的表只有几个,所以,只会查询特定的几个表,减少查询的复杂度。

 

4、扩容问题

由于订单系统不仅会通过订单号查找订单,还有可能会通过用户id查找,通过商家id查找,查找所有订单等,但是无论是哪种身份的用户查询都有一个特性,就是很少会查询三个月之前的数据,所以我们可以考虑吧三个月之前的数据迁移到历史数据库中,给新的数据腾空间,从而解决容量增长的问题。

例如:我们可以在3,6,9,12月份的月底进行数据迁移,在6月底,将3月之前的数据都迁移到历史数据库中,历史数据库不要求有多高的性能,只要空间足够就可以,节约成本。

二、使用MQ,起缓冲作用,缓解并发问题

这里我们在生成订单的时候,不直接调用生成订单的接口,而是将订单信息发送到MQ中,利用Mq队列先进先出的特性,一个是使用MQ系统做缓冲作用,还有就是作为MQ的消费者,一定是一个一个处理订单,所以,减少了订单系统的压力,也减少了并发。

四、订单系统数据库设计

  • 用户订单表---该表格用作用户查询使用(根据用户id分表)表名:xc_order_u
  • 商家订单表---该表格用作商家查询使用(根据时间分表)表名:xc_order_o
  • 订单商品表---该订单的商品信息(防止商品表中商品信息修改了,订单商品也被修改了)表名:xc_order_item
  • 订单物流表---该订单的物流信息,表名:xc_order_shipping
DROP TABLE IF EXISTS `xc_order_item`;
CREATE TABLE `xc_order_item` (
  `item_id` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '商品id',
  `order_id` varchar(50) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '订单id',
  `num` int(10) DEFAULT NULL COMMENT '商品购买数量',
  `title` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '商品标题',
  `price` double DEFAULT NULL COMMENT '商品单价',
  `total_fee` double DEFAULT NULL COMMENT '商品总金额',
  `pic_path` varchar(600) COLLATE utf8_bin DEFAULT NULL COMMENT '商品图片地址',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `extend1` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `extend2` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `extend3` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `skuid` bigint(20) NOT NULL DEFAULT '0' COMMENT 'skuid',
  PRIMARY KEY (`order_id`),
  KEY `order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='订单商品表';
CREATE TABLE `xc_order_o` (
  `order_id` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '订单id',
  `payment` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '实付金额。精确到2位小数;单位:元。如:200.07,表示:200元7分',
  `payment_type` int(2) DEFAULT NULL COMMENT '支付类型,1、在线支付,2、货到付款',
  `post_fee` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '邮费。精确到2位小数;单位:元。如:200.07,表示:200元7分',
  `status` int(10) DEFAULT NULL COMMENT '状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭',
  `create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '订单更新时间',
  `payment_time` datetime DEFAULT NULL COMMENT '付款时间',
  `consign_time` datetime DEFAULT NULL COMMENT '发货时间',
  `end_time` datetime DEFAULT NULL COMMENT '交易完成时间',
  `close_time` datetime DEFAULT NULL COMMENT '交易关闭时间',
  `shipping_name` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '物流名称',
  `shipping_code` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '物流单号',
  `user_id` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '用户id',
  `buyer_message` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '买家留言',
  `buyer_nick` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '买家昵称',
  `buyer_rate` int(2) DEFAULT NULL COMMENT '买家是否已经评价',
  `extend1` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `extend2` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `extend3` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  UNIQUE KEY `order_id` (`order_id`) USING BTREE,
  KEY `create_time` (`create_time`),
  KEY `buyer_nick` (`buyer_nick`),
  KEY `status` (`status`),
  KEY `payment_type` (`payment_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='订单基本信息表';
CREATE TABLE `xc_order_shipping` (
  `order_id` varchar(50) NOT NULL COMMENT '订单ID',
  `receiver_name` varchar(20) DEFAULT NULL COMMENT '收货人全名',
  `receiver_phone` varchar(20) DEFAULT NULL COMMENT '固定电话',
  `receiver_mobile` varchar(30) DEFAULT NULL COMMENT '移动电话',
  `receiver_address` varchar(200) DEFAULT NULL COMMENT '收货地址,如:xx路xx号',
  `receiver_zip` varchar(6) DEFAULT NULL COMMENT '邮政编码,如:310001',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL COMMENT '更新时间',
  `extend1` varchar(255) DEFAULT NULL,
  `extend2` varchar(255) DEFAULT NULL,
  `extend3` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单用户基本信息表';
CREATE TABLE `xc_order_u` (
  `order_id` varchar(50) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '订单id',
  `payment` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '实付金额。精确到2位小数;单位:元。如:200.07,表示:200元7分',
  `payment_type` int(2) DEFAULT NULL COMMENT '支付类型,1、在线支付,2、货到付款',
  `post_fee` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '邮费。精确到2位小数;单位:元。如:200.07,表示:200元7分',
  `status` int(10) DEFAULT NULL COMMENT '状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭',
  `create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '订单更新时间',
  `payment_time` datetime DEFAULT NULL COMMENT '付款时间',
  `consign_time` datetime DEFAULT NULL COMMENT '发货时间',
  `end_time` datetime DEFAULT NULL COMMENT '交易完成时间',
  `close_time` datetime DEFAULT NULL COMMENT '交易关闭时间',
  `shipping_name` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '物流名称',
  `shipping_code` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '物流单号',
  `user_id` int(11) DEFAULT NULL COMMENT '用户id',
  `buyer_message` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '买家留言',
  `buyer_nick` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '买家昵称',
  `buyer_rate` int(2) DEFAULT NULL COMMENT '买家是否已经评价',
  `extend1` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `extend2` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `extend3` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`order_id`),
  UNIQUE KEY `order_id` (`order_id`) USING BTREE,
  KEY `create_time` (`create_time`),
  KEY `buyer_nick` (`buyer_nick`),
  KEY `status` (`status`),
  KEY `payment_type` (`payment_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='订单基本信息表';

数据库截图如下:

三、订单系统流程

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
信息系统项目管理师2023考试内容包括综合知识内容大纲中的各个方面,如信息化和信息系统项目整体管理、项目范围管理、项目进度管理、项目成本管理、项目质量管理、项目人力资源管理、项目沟通管理和干系人管理、项目风险管理、项目采购管理、项目合同管理、项目文档管理、配置管理与知识管理等\[1\]。此外,考试还涉及到项目集管理、项目组合管理、组织级项目管理、信息系统安全管理、知识管理、法律法规和标准规范、管理科学基础知识、专业英语、信息系统项目管理职业道德规范等方面的知识和技能\[2\]。 具体考试题目可能包括对信息系统项目范围管理和合同管理的论述。例如,对于信息系统项目范围管理,考生需要清晰地定义项目范围,确定项目应该做的工作和不应该包括在项目中的工作。可以结合自己参与管理过的一个信息系统项目,描述项目的背景、规模、发起位、目的、内容、组织结构、周期和交付成果,并说明自己在其中承担的工作。然后,论述项目范围管理的过程,并根据项目范围描述编写核心范围对应的需求跟踪矩阵,最后给出项目的WBS(工作分解结构)\[3\]。 对于信息系统项目的合同管理,考生可以概述自己参与管理过的信息系统项目,并描述项目的背景、规模、发起位、目的、内容、组织结构、周期和交付成果。然后,论述信息系统项目合同管理的认识,包括合同管理的过程和在有监督参与的情况下编写详细的合同索赔流程。最后,可以根据所叙述的信息系统项目编制一份相应的项目合同,列出主要的条款内容\[3\]。 以上是关于信息系统项目管理师2023考试内容的简要介绍,具体的考试要求和题目可能有所变化,请考生以官方发布的考试大纲和相关资料为准。 #### 引用[.reference_title] - *1* *3* [随笔:信息系统项目管理师(软考高级2023)考试指南](https://blog.csdn.net/weixin_43193868/article/details/127658542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [2023版信息系统项目管理师考试大纲](https://blog.csdn.net/weixin_46619295/article/details/129815627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值