Board logo

标题: 秒杀系统实践(3) [打印本页]

作者: look_w    时间: 2019-2-19 15:39     标题: 秒杀系统实践(3)

1、在缓存预热好,秒杀开始之前有流量进来怎么办?或者秒杀已经库存为0应该结束秒杀怎么办?为了解决这个问题我们应该在步骤1的时候添加秒杀开始和秒杀结束时间,作为8操作开始之前的第一道判断请求,如果在开始之前以及在结束时间之后直接返回秒杀未开始和秒杀已经结束
所以更全的流程图如下:
<pre>


2、操作11中,得知有库存直接下订单会不会真对数据库造成很大压力呢?肯定会的,所以先期减少秒杀的产品数以及库存数量做一些尝试,如果调用订单接口插入订单数据失败,应该释放库存信息,让请求重新可以秒杀产品信息
<b>评估部署多少台应用服务器和redis集群</b>
这个也是可评估的,单台tomcat容器的每秒访问上限是1000左右,单台redis机器低估一下每秒也可以抗1万次读写,举例如果秒杀的每秒的访问是1万,部署10台应用服务器,一个redis集群 2-3台redis服务器(可写的redis节点)理论就都可以抗住了(这边峰值计算容器级别的redis级别需要分开来算,因为先需要访问tomcat应用再去访问redis,tomcat也有连接数上限)。当然一个整个流程下来其实是不需要1秒的,大致100毫秒左右,所以理论抗并发峰值应该是可以抗1万 * 10左右。
<h4>三、风险评估</h4>
<b>a、生产前压力测试</b>
使用jmeter做初期库存数秒杀,看看redis、以及订单接口是否异常或者超时,预估本次活动的访问流量,做上线上的验证
<b>b、生产可降级熔断</b>
1、当瞬间秒杀产品库存太大,造成的redis写暴增,可能造成线程阻塞最后写超时对于如上的异常,添加一个秒杀开关,大量异常时开关关闭停止一切秒杀活动,以免造成更大的损失
2、由于订单还没有做sharding,当每秒写超过单机承受能力甚至影响正常的非秒杀产品下单该怎么办?对于如上的异常添加一个秒杀开关,如果超时或者异常切换到订单临时表中,启用定时任务将订单从临时表数据取出来然后调用下单接口更新到订单库
<h4>四、监控</h4>
1、监控redis调用性能,这边主要是看读和写的性能两个指标,看接口日志是否超时或者异常,查看公司埋点框架mertic统计是否有拐点,因为内存消耗很少通过zabbix查看redis集群cpu信息
2、监控下单接口性能,看是否超时或者异常,统计booking库中失败或者未到order库的订单数,定时预警超过阀值自动发邮件通知相关人员
3、观察订单master数据库的性能,目前master机器是32核128g内存,通过zabbix查看其cpu 内存 以及Io使用情况,查看slave机器的延迟分发情况,因为订单信息显示都是从slave机器读取的
<h4>五、总结</h4>
鉴于目前数据库还不支持sharding,对于大量的insert只能通过增加cpu、内存和SSD来弥补,不利于横向扩展且代价也比较昂贵,后期还是应该完善订单库sharding.降低单点单库的数据更新压力,是个长远的策略.
总之大胆尝试小心验证,多备预案服务做到可切换可降级,减少系统间耦合尽量将风险降到最低。
如果喜欢请帮忙点个赞,谢谢!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0