之前参与一个峰值qps达到20w多的电商促销项目,现在做一些总结与思考,可能存在纰漏,欢迎交流探讨。本人长期专注于服务层,文中对前端以及运维的理解可能不够深入。
欢迎各位有理有据的交流探讨。
架构隔离
在开始具体细节时,先说说架构隔离。
对于这个促销系统的部署完全与主站的其他系统隔离开,避免大流量冲击下对其他系统造成影响,甚至雪崩。
- 域名隔离 使用独立的域名对请求做隔离
- 应用隔离 使用独立的集群机器部署前端应用与服务端应用
- 数据隔离 使用独立的Redis集群、mysql集群处理数据
前端流控
- 基本校验 一些简单的资格校验,如登陆等等
- 页面静态数据缓存 浏览器缓存静态数据、CDN缓存静态数据。
- 业务流程削峰 通过使用验证码或者问答,拉车秒杀时间,放缓瞬时并发。
反向代理缓存
在反向代理(Varnish,Nginx)中缓存静态页面,对页面请求直接返回。
服务端设计
服务端是本文重点,也是我关注的地方。
实现无锁设计(数据库的部分根据业务场景用乐观锁):
图片较大,我希望用一张图描述我想说的,请点击右键单独放大查看。
扩容
没有机会做,但是思考了下这种方案可取。还是用一张图
分库分表
待续
缓存击穿问题解决
待续
集群性能常用计算公式
qps(query per second)=并发数/响应时间(通常要求0.1s左右)
tps(transaction per second)=事务数/响应时间(事务 比如接口指有个clientSend
并且clientReceive的过程)
如何 根据服务日调用次数 计算每天峰值的qps?
( 日调用次数 * 80% ) / ( 24*3600 * 20% ) = 峰值时间每秒请求数(QPS)
单节点qps
最大连接数/平均响应时间()=qps
通常最大线程数<=最大连接数
平均响应时间通常要求100ms左右根据峰值qps与单节点qps计算节点个数?
峰值接口需要的QPS / 单节点的QPS = 需要的节点实例
示例:
每天300w 调用量的接口,这个接口需要满足到多少QPS?( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
单机QPS是58,需要结果节点来支持?**
139 / 58 = 3