1. 巧妙应对高并发流量,20节点4W+并发120毫秒响应
随着互联网的发展,高并发成了很多企业遇到的一道难题。轻则响应延时太高影响用户体验,重则页面白屏无法访问,甚至服务崩溃。
2. 灵感由来
多年前笔者在一家游戏公司负责游戏(波某某市)的门户网站。通常游戏会有很多攻略文章,这些文章内容会比较长,如果每次都从数据库读取必然会给数据库带来较大的压力。当时的处理方案是通过fremarket将游戏攻略生成为一个个的静态页面,通过nginx暴露到出去,再由CDN缓存。
具体流程如下:
- 运营人员在管理后台添加游戏攻略。
- 管理后台发送MQ消息
- WEB端收到消息后生成静态html页面
随着前端技术的崛起,前后的分离的模式成为了主流,但前端开发人员几乎不会关心后端服务器和数据库的压力。想要使用生成静态页面的方式变的困难起来,因为大多少前端仅知道或常用的是客户端渲染CSR模式,对于静态页面生成SSG与服务端渲染SSR了解较少。
在一次偶然的机会了解到前端的服务端渲染与静态页面生成模式便让我看到了希望。但很快静态页面生成的模式被我排出了,原因是:静态页面是在前端代码build时生成,这并不能解决新增的内容生成静态页面,比如添加了一篇新的游戏攻略。
于是我将重点放在了服务端渲染,在仔细了解了一下什么叫服务端渲染。其原理与后端使用JSP原理是一样的,当请求过来服务器从数据库获取数据,然后通过jsp组装成html字符串返回给浏览器。只不过前端不是访问数据库,而是调用了后端的接口。
3. 主题
突然,灵光一闪~(代码设计、架构设计也是需要灵感的)。
CDN有一项功能:回源。 当用户发起一个请求时,如果CDN中没有该项内容,便可以通过回源配置访问源站内容,拿到源站内容后返回给用户同时也会缓存到CDN,下次再有用户访问会直接读取CDN缓存中的内容。
也就是说我们完全可以不用生成静态页面,只需要CDN回源时服务端渲染返回html内容即可。这样与生成静态页面效果一摸一样,同时还省去了静态页面生成步骤。具体流程如下:
这真是一个不错的方案。但很快还是发现了有不足的地方,因为现在大多数的项目都是在做小程序,而小程序没有页面。挠了挠头~灵光再次闪过。我可以通过CDN回源到前端服务端渲染服务器,同样我也可以回源到服务器接口(静态页面是一段字符串接口响应的json也是字符串),此时不能你用的是公众号还是小程序问题都可以解决。完美~ 具体流程如下:
除此之外我们还需要做好本地缓存。在高并发场景下如果没有本地缓存,那么当CDN缓存过期的一瞬间大量的请求将会穿透到数据库,从而导致系统崩溃。
4. 真实压测场景
以下为使用了该解决方案辛某社区双十一活动生产环境压测报告。
服务器为20台4核8G 施压机20台,带宽匀已打满。 最高并发10000人在线。平均QPS 4W+、最高QPS 5W+、平均响应119 毫秒、成功率99.99%(另外0.01%为施压机报错)实际成功率100%
本地缓存:
CDN加本地缓存:
客户端施压机性能:
从报告可以看出CDN比本地缓存QPS要高出几千,响应时间更快,但本地缓存是内网压测。两次压测QPS都在4-5万之间,且服务器CPU指标都在50%-60%左右,结合施压机器带宽监控可以看出,此时施压机带宽已经达到上限
以下为阿某云客服给的回复