秒杀架构设计&秒杀表结构设计

207 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

每日英语:

For what it's worth, it's never too late.

翻译:只要是值得做的事,永远都不怕晚。 ——《本杰明·巴顿奇事》

秒杀架构设计

1609559865198.png

针对秒杀抢单业务的架构设计,不能和普通的商品抢单一样,架构应该考虑热门商品造成的并发、冷门商品能有可用的系统资源、波动商品走向热门的发现功能、高并发抢单超卖问题解决等,如上图架构设计:

1:用户抢单的时候,会将用户抢购的商品信息存入到大数据分析系统Apache Druid。
2:抢单信息存入到Apache Druid后,进行实时分析,访问频率高的商品将被存入到Redis缓存单独隔离。
3:用户抢单先经过Nginx,Nginx做了限流后,请求会到达Gateway集群。
4:Gateway集群会判断当前商品是否是热门商品。
5:如果商品是热门商品,在Gateway中会进行排队(MQ)下单,此时抢单流程结束。如果是非热门商品,直接下单即可。
6:普通订单直接下单,热门商品下单需要读取排队信息(MQ)进行下单,下单后将抢单信息通知到前端(WebSocket)。

秒杀表结构

上面我们分析过秒杀业务,我们接下来对秒杀业务的表结构进行分析。

商品表:

CREATE TABLE `seckill_goods` (
  `id` varchar(60) NOT NULL,
  `sup_id` varchar(60) DEFAULT NULL COMMENT 'spu ID',
  `sku_id` varchar(60) DEFAULT NULL COMMENT 'sku ID',
  `name` varchar(100) DEFAULT NULL COMMENT '标题',
  `images` varchar(150) DEFAULT NULL COMMENT '商品图片',
  `price` int(20) DEFAULT NULL COMMENT '原价格',
  `seckill_price` int(20) DEFAULT NULL COMMENT '秒杀价格',
  `num` int(11) DEFAULT NULL COMMENT '秒杀商品数',
  `store_count` int(11) DEFAULT NULL COMMENT '剩余库存数',
  `content` varchar(2000) DEFAULT NULL COMMENT '描述',
  `activity_id` varchar(60) DEFAULT NULL COMMENT '活动ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

秒杀订单表:

CREATE TABLE `seckill_order` (
  `id` varchar(60) NOT NULL COMMENT '主键',
  `seckill_goods_id` varchar(60) DEFAULT NULL COMMENT '秒杀商品ID',
  `money` int(10) DEFAULT NULL COMMENT '支付金额',
  `username` varchar(50) DEFAULT NULL COMMENT '用户',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `status` int(1) DEFAULT NULL COMMENT '状态,0未支付,1已支付',
  `weixin_transaction_id` varchar(30) DEFAULT NULL COMMENT '交易流水',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

活动表:

CREATE TABLE `seckill_activity` (
  `id` varchar(60) NOT NULL,
  `activity_name` varchar(60) NOT NULL COMMENT '活动名字',
  `type` int(1) NOT NULL COMMENT '活动分类  0 shop秒杀、1 每日特价、2 大牌闪购  、 3 品类秒杀 、 4 节日活动',
  `start_time` datetime NOT NULL COMMENT '开始时间',
  `end_time` datetime NOT NULL COMMENT '结束时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

总结

本篇主要介绍了一下秒杀架构设计和秒杀表结构设计。