秒杀流程设计方案「秒杀的流程」

互联网 2023-02-16 12:05:50

今天给大家普及一下秒杀流程设计方案「秒杀的流程」相关知识,最近很多在问秒杀流程设计方案「秒杀的流程」,希望能帮助到您。

1 秒杀设计1.1 业务流程

电商项目中,秒杀属于技术挑战最大的业务。后台可以发布秒杀商品后或者将现有商品列入秒杀商品,热点分析系统会对商品进行分析,对热点商品做特殊处理。商城会员可以在秒杀活动开始的时间内进行抢购,抢购后可以在线进行支付,支付完成的订单由平台工作人员发货,超时未支付订单会自动取消。

​ 当前秒杀系统中一共涉及到管理员后台、搜索系统、秒杀系统、抢单流程系统、热点数据发现系统,如下图:

1.2 秒杀架构

​ B2B2C商城秒杀商品数据一般都是非常庞大,流量特别高,尤其是双十一等节日,所以设计秒杀系统,既要考虑系统抗压能力,也要考虑系统数据存储和处理能力。秒杀系统虽然流量特别高,但往往高流量抢购的商品为数不多,因此我们系统还需要对抢购热门的商品进行有效识别。

​ 商品详情页的内容除了数量变更频率较高,其他数据基本很少发生变更,像这类变更频率低的数据,我们可以考虑采用模板静态化技术处理。

​ 秒杀系统需要考虑抗压能力,编程语言的选择也有不少讲究。项目发布如果采用Tomcat,单台Tomcat抗压能力能调整到大约1000左右,占用资源较大。Nginx抗压能力轻飘的就能到5万,并且Nginx占用资源极小,运行稳定。如果单纯采用Java研发秒杀系统,用Tomcat发布项目,在抗压能力上显然有些不足,如果采用Lua脚本开发量大的功能,采用Nginx Lua处理用户的请求,那么并发处理能力将大大提升。

​ 下面是当前秒杀系统的架构图:

1.3 数据库设计1.3.1 秒杀商品数据库

数据库名字:seckill_goods

秒杀活动表:tb_activity

CREATE TABLE `tb_activity` (`id` varchar(60) NOT NULL,`name` varchar(100) NOT NULL,`status` int(2) NOT NULL DEFAULT '1' COMMENT '状态:1开启,2未开启',`startdate` date DEFAULT NULL,`begintime` datetime DEFAULT NULL COMMENT '开始时间,单位:时分秒',`endtime` datetime DEFAULT NULL COMMENT '结束时间,单位:时分秒',`total_time` float DEFAULT NULL,`is_del` int(1) DEFAULT '1' COMMENT '删除:1未删除,2已删除',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

商品品牌表:tb_brand

CREATE TABLE `tb_brand` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '品牌id',`name` varchar(100) NOT NULL COMMENT '品牌名称',`image` varchar(1000) DEFAULT '' COMMENT '品牌图片地址',`letter` char(1) DEFAULT '' COMMENT '品牌的首字母',`seq` int(11) DEFAULT NULL COMMENT '排序',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=325468 DEFAULT CHARSET=utf8 COMMENT='品牌表';

秒杀商品分类表:tb_category

CREATE TABLE `tb_category` (`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID',`name` varchar(50) DEFAULT NULL COMMENT '分类名称',`goods_num` int(11) DEFAULT '0' COMMENT '商品数量',`is_show` char(1) DEFAULT NULL COMMENT '是否显示',`is_menu` char(1) DEFAULT NULL COMMENT '是否导航',`seq` int(11) DEFAULT NULL COMMENT '排序',`parent_id` int(20) DEFAULT NULL COMMENT '上级ID',`template_id` int(11) DEFAULT NULL COMMENT '模板ID',PRIMARY KEY (`id`),KEY `parent_id` (`parent_id`)) ENGINE=InnoDB AUTO_INCREMENT=11177 DEFAULT CHARSET=utf8 COMMENT='商品类目';

秒杀时刻表:tb_seckill_time

CREATE TABLE `tb_seckill_time` (`id` int(10) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL COMMENT '秒杀分类名字,双十一秒杀,每日时段秒杀等',`starttime` time NOT NULL COMMENT '开始时间',`endtime` time DEFAULT NULL,`total_time` float(11,2) DEFAULT NULL COMMENT '秒杀时长,按小时计算',`status` int(2) DEFAULT '1' COMMENT '是否启用,1:启用,2:停用',`sort` int(2) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

秒杀商品表:tb_sku

CREATE TABLE `tb_sku` (`id` varchar(60) NOT NULL COMMENT '商品id',`name` varchar(200) NOT NULL COMMENT 'SKU名称',`price` int(20) NOT NULL DEFAULT '1' COMMENT '价格(分)',`seckill_price` int(20) DEFAULT NULL COMMENT '单位,分',`num` int(10) DEFAULT '100' COMMENT '库存数量',`alert_num` int(11) DEFAULT NULL COMMENT '库存预警数量',`image` varchar(200) DEFAULT NULL COMMENT '商品图片',`images` varchar(2000) DEFAULT NULL COMMENT '商品图片列表',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`spu_id` varchar(60) DEFAULT NULL COMMENT 'SPUID',`category1_id` int(10) DEFAULT NULL COMMENT '类目ID',`category2_id` int(10) DEFAULT NULL,`category3_id` int(10) DEFAULT NULL,`category1_name` varchar(20) DEFAULT NULL,`category2_name` varchar(20) DEFAULT NULL,`category3_name` varchar(20) DEFAULT NULL COMMENT '类目名称',`brand_id` int(11) DEFAULT NULL,`brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名称',`spec` varchar(200) DEFAULT NULL COMMENT '规格',`sale_num` int(11) DEFAULT '0' COMMENT '销量',`comment_num` int(11) DEFAULT '0' COMMENT '评论数',`seckill_end` datetime DEFAULT NULL COMMENT '秒杀结束时间',`seckill_begin` datetime DEFAULT NULL COMMENT '秒杀开始时间',`status` int(1) DEFAULT '1' COMMENT '商品状态 1普通商品,2参与秒杀',`islock` int(1) DEFAULT '1' COMMENT '是否锁定,1:未锁定,2:锁定',`seckill_num` int(11) DEFAULT NULL COMMENT '秒杀数量',PRIMARY KEY (`id`),KEY `cid` (`category1_id`),KEY `status` (`status`),KEY `updated` (`update_time`),KEY `spu_id` (`spu_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

秒杀商品活动关联表:tb_sku_act

CREATE TABLE `tb_sku_act` (`sku_id` varchar(60) NOT NULL,`activity_id` varchar(60) NOT NULL,PRIMARY KEY (`sku_id`,`activity_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;1.3.2 秒杀订单数据库

秒杀订单表:tb_order

CREATE TABLE `tb_order` (`id` varchar(60) COLLATE utf8_bin NOT NULL COMMENT '订单id',`total_num` int(11) DEFAULT NULL COMMENT '数量合计',`pay_type` varchar(1) COLLATE utf8_bin DEFAULT NULL COMMENT '支付类型,1、在线支付、0 货到付款',`create_time` datetime DEFAULT NULL COMMENT '订单创建时间',`update_time` datetime DEFAULT NULL COMMENT '订单更新时间',`pay_time` datetime DEFAULT NULL COMMENT '付款时间',`consign_time` datetime DEFAULT NULL COMMENT '发货时间',`end_time` datetime DEFAULT NULL COMMENT '交易完成时间',`close_time` datetime DEFAULT NULL COMMENT '交易关闭时间',`receiver_contact` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人',`receiver_mobile` varchar(12) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人手机',`receiver_address` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人地址',`transaction_id` varchar(30) COLLATE utf8_bin DEFAULT NULL COMMENT '交易流水号',`order_status` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '订单状态,0:未完成,1:已完成,2:已退货',`pay_status` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '支付状态,0:未支付,1:已支付,2:支付失败',`consign_status` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '发货状态,0:未发货,1:已发货,2:已收货',`is_delete` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '是否删除',`sku_id` varchar(60) COLLATE utf8_bin DEFAULT NULL,`name` varchar(200) COLLATE utf8_bin DEFAULT NULL,`price` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `create_time` (`create_time`),KEY `status` (`order_status`),KEY `payment_type` (`pay_type`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;1.3.3 管理员数据库

管理员表:tb_admin

CREATE TABLE `tb_admin` (`id` int(11) NOT NULL AUTO_INCREMENT,`login_name` varchar(20) DEFAULT NULL COMMENT '用户名',`password` varchar(60) DEFAULT NULL COMMENT '密码',`status` char(1) DEFAULT NULL COMMENT '状态',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;1.3.4 用户数据库

用户表:tb_user

CREATE TABLE `tb_user` (`username` varchar(50) NOT NULL COMMENT '用户名',`password` varchar(100) NOT NULL COMMENT '密码,加密存储',`phone` varchar(20) DEFAULT NULL COMMENT '注册手机号',`email` varchar(50) DEFAULT NULL COMMENT '注册邮箱',`created` datetime NOT NULL COMMENT '创建时间',`updated` datetime NOT NULL COMMENT '修改时间',`nick_name` varchar(50) DEFAULT NULL COMMENT '昵称',`name` varchar(50) DEFAULT NULL COMMENT '真实姓名',PRIMARY KEY (`username`),UNIQUE KEY `username` (`username`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

收件地址表:tb_address

CREATE TABLE `tb_address` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) DEFAULT NULL COMMENT '用户名',`provinceid` varchar(20) DEFAULT NULL COMMENT '省',`cityid` varchar(20) DEFAULT NULL COMMENT '市',`areaid` varchar(20) DEFAULT NULL COMMENT '县/区',`phone` varchar(20) DEFAULT NULL COMMENT '电话',`address` varchar(200) DEFAULT NULL COMMENT '详细地址',`contact` varchar(50) DEFAULT NULL COMMENT '联系人',`is_default` varchar(1) DEFAULT NULL COMMENT '是否是默认 1默认 0否',`alias` varchar(50) DEFAULT NULL COMMENT '别名',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;