为什么要做秒杀?这个不难解释,最起码对于互联网电商业务来说很常见,那怎么样才能设计出相对比较完善的秒杀策略呢?我觉得这其中有两个关键点:
下面我来谈谈我们的实践。 整体系统架构
大胆设计 关于怎么支持高并发有两种策略可以结合,通过前端限流机制只放10%左右的流量到后端,90%的人直接提示秒杀结束,下面我主要是讲讲后端怎么实现。我想Redis大家都用过,其高并发能力超强,理论峰值是单机每秒能支持10万次读写,Redis还可以支持分布式集群扩展性强。还有一点Redis更新操作是原子性的,更新数据是单线程的安全有保证。锁定库存就用Redis来实现,大致的流程如下: 流程梳理
缺陷思考 在缓存预热好,秒杀开始之前有流量进来怎么办?或者秒杀已经库存为0应该结束秒杀怎么办?为了解决这个问题我们应该在步骤1的时候添加秒杀开始和秒杀结束时间,作为操作8开始之前的第一道判断请求。如果在开始之前以及在结束时间之后则直接返回秒杀未开始或者秒杀已经结束。所以更为完善的流程图应该如下: 操作11中,得知有库存直接下订单会不会真对数据库造成很大压力呢?肯定会的,所以先期可以减少秒杀的产品数以及库存数量,如果调用订单接口插入订单数据失败,应该释放库存信息,让请求重新可以秒杀产品信息。 如何评估应该部署多少台应用服务器和Redis集群?单台Tomcat容器的每秒访问上限是1000左右,单台Redis机器低估一下每秒也可以抗1万次读写。举例来说,如果秒杀的每秒的访问是1万,部署10台应用服务器,一个Redis集群,2-3台Redis服务器(可写的redis节点)理论就都可以了(这边峰值计算容器级别的Redis级别需要分开来算,因为先需要访问Tomcat应用再去访问Redis,Tomcat也有连接数上限)。当然一个整个流程下来其实是不需要1秒的,大致100毫秒左右,所以理论抗并发峰值应该是可以抗1万 * 10左右。 风险评估 生产前压力测试 使用JMeter做初期库存数秒杀,看看Redis以及订单接口是否异常或者超时,预估本次活动的访问流量,做上线上的验证。 生产可降级熔断
监控
鉴于目前数据库还不支持sharding,对于大量的insert只能通过增加CPU、内存和SSD来弥补,不利于横向扩展且代价也比较昂贵,后期还是应该完善订单库sharding,降低单点单库的数据更新压力,是个长远的策略。总之大胆尝试小心验证,多备预案服务做到可切换可降级,减少系统间耦合尽量将风险降到最低。 |
|
来自: openlabzeng > 《待分类》