Bootstrap

模块九

业务背景

你作为一个电商创业公司的架构师,负责设计6.18大促秒杀系统的设计,你们的业务模式如下:

业务基本场景

商品详情 -> 商品结算 -> 发货

秒杀场景和普通购买商品,在流程上确定相同的。不考虑使用预先报名的形式。

存储架构设计

存储性能估算

【商品详情页】

2条商品详细信息

【商品结算】

订单数量只有1010条。

【发货】

发货只有商品数量的个数,1010个发货单数据,忽略不计。

存储架构设计

日活为100w的系统,商品数量和交易单量都较大,都使用了分库分表,并不会因为这里是秒杀场景单独设计存储架构。商品使用了商品ID作为分区key,订单使用orderId+用户id来作为分库key

MySQL

MySQL存储订单,商品,优惠券,和正常商品设计相同,不需要另外设计。

Redis

秒杀活动开始前,将商品,库存存储到redis中,所以这里使用平常使用的redis cluster即可。不使用主从是因为,当后期秒杀这类的运营活动增多,主从模式不利于后期扩展。并且当前日活已经100w,数据缓存数据量较大,所以选择redis cluster。

计算架构设计

计算性能估算

假设:秒杀参加的用户是日活的一倍

【商品详情页】

2个商品详细信息

假设200w用户参加秒杀活动,并且假设50%用户会请求详情页3次,刷新页面看数据

200w*50% + 200*50%*3 = 400w

假设活动前1分钟和活动持续30秒,详情页访问TPS = 400w/90s = 4.5w/s

【商品结算】

商品结算既是抢购的按钮,假设这200w用户都会去请求计算价格,获取优惠后的明细。并且估算30%的用户会多请求3次。

200w*70% + 200w*30%*3 = 320w

假设活动前1分钟和活动持续30秒,详情页访问TPS = 320w/90s = 3.5w/s

真正扣减资源和最终计算,只会处理这1010个商品,所以这里忽略不计。

【发货】

忽略不计

负载均衡

如果考虑到非秒杀的其他商品下单,会选择在Nginx前,使用LVS做一层负载均衡。

计算缓存架构

其它架构设计

可扩展架构

当前百万日活,目前已经是采用的微服务模式。针对秒杀场景的扩展架构,需要将请求接入层,价格计算层单独分模块。也可以使用流程编排,组合普通下单请求和秒杀请求。

微服务使用流量染色,或者dubbo这类的RPC框架,使用group区分隔离秒杀和常规下单请求。

灾备

因为目前是单机房,所以此次设计先不设计多机房。但是MySQL,Redis存储中间件,需要数据持久化,单机房使用从服务器实时备份数据。

高可用架构

使用限流策略,防止大量请求通过后台服务打到数据库。针对秒杀场景,超过一定比例的请求后,后续的请求可以直接降级,返回用户秒杀失败的结果。

针对秒杀场景,秒杀成功可以直接返回用户秒杀成功,将快照数据放到MQ中,下游服务防止因为瞬时大量请求影响正常场景的请求。