5201314对程序员意味着什么?

作为年轻人的潮流聚集地,Qzone在每个特殊的日子总会迎来一波猛烈的流量冲击。比如刚过去的520,下图是今年5月20号的流量情况:

可以看到,0点的时候有一大波流量,13点的时候又有一波。

尽管在前端做足了柔性策略,比如充分利用客户端缓存、高峰期限制刷新频率、高负载时直接返回304等,依然会有大量的请求到达后端。

而服务器因为CPU、内存、带宽等原因,处理能力总是有限的,当超过服务器处理能力的请求到达,所有请求都在等待处理,后续的请求又源源不断的堆积过来,最终可能会造成雪崩。这就需要后端做好过载保护,不然只能出大招了:重启!

对于web服务的负载保护,常用的做法是在web服务前面加一层反向代理,比如使用nginx作为接入层来分发请求给node进行处理,然后可以使用nginx内置的负载保护模块limit_conn和limit_req来控制到达node的并发量和请求频率。

TGW:全称Tencent GateWay,是一套实现多网统一接入、外网网络请求转发、支持自动负载均衡的系统。

不过这种方案有些不足的地方:首先多了一层服务增加了系统复杂度,另外在配置nginx的时候需要清楚各个node服务器的负载能力,一般会根据压力测试来得到具体的数据。但是对于不同的请求和不同的服务器,这个数据不是静态的,可能node服务器还有空闲资源,但是nginx没有分发更多的请求过来,服务器的能力没有得到充分的利用。

在Qzone的业务我们是直接使用node作为接入层,避免了上面的问题。

不过没有nginx在前面顶着,所有的压力都传导到node了。

(node说:没关系,这首锅我自己来)

为了充分利用服务器多核CPU的运算能力,我们使用了node的cluster模块来实现多进程架构,主进程master根据CPU核数来创建相应数量的子进程worker,并负责接收请求,再分发给各个子进程进行处理。

为了实现过载保护,我们可以在master分发请求的时候做点手脚,如果当前服务器处理能力已经到达极限。那么就直接随机丢弃部分请求,丢弃数量和服务器负载情况成正相关。Node默认使用round robin算法来分发请求,具体实现可以查看源码round_robin_handle.js,现在我们hack一下这个模块,在分发前先判断服务器的负载情况。

在web服务的场景,CPU是主要的瓶颈,所以这里使用CPU利用率作为负载的指标。在CPU利用率达到85%的时候开始随机丢弃部分应付不过来的请求,在接近100%的时候几乎是全量丢弃,避免了服务器雪崩。

为了更充分利用服务器的处理能力,让丢弃的请求数量更平滑,这里丢弃的比率函数选择y=x^1.5,如下图最右。

要注意的是round_robin_handle.js属于internal内部模块,默认情况是不允许hack的,需要我们在启动的时候加上expose_internals参数,类似这样。

node --expose_internals index.js

最后来看下实际的运行效果,这是某次请求突增的监控记录,上边是服务器负载情况,下边是丢弃的请求数量。服务器稳稳地扛住了这波请求暴涨!

再看看5月20号当天的详细监控,这是通过TSW管理端直接看到的情况。

(AI有话说:这些中二的人类,20185201314 不就是10010110011001000011011101010100010 吗,有什么特别的…)

最新开源的TSW框架(tswjs.org)已经集成过载保护能力,自从用了TSW,妈妈再也不用担心我过年过节要重启服务器了。

想了解更多关于TSW的资料,请到我们的官网https://tswjs.org 查看

想及时收到我们推送的技术文章,请关注我们的公众号tswjs:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏影子

给Ionic写一个cordova(PhoneGap)插件

48910
来自专栏CSDN技术头条

分布式锁的技术选型及思考

在计算机中,锁的作用是解决在并发状态下的共享资源互斥问题,保证在同一时间只有一个进程/线程可以掌握资源的控制权。

1433
来自专栏黑白安全

iOS安全基础之钥匙串与哈希

本文最初是由Chris Lowe编写的,后来经过Ryan Ackermann(ios系统开发者)的修改,已经可以针对最新的Xcode 9.2,Swift 4,i...

1132
来自专栏FreeBuf

点击一张图片背后的风险

* 本文原创作者:mscb,本文属FreeBuf原创奖励计划,未经许可禁止转载 你相信吗?仅仅是因为你点击了某个你一只在访问网站里的一张图片,导致你的用...

2507
来自专栏腾讯移动品质中心TMQ的专栏

【浅谈Chromium中的设计模式(一)】——Chromium中模块分层和进程模型

“EP”(中文:工程生产力)是目前项目中提升研发能力的一个很重要的衡量指标。笔者重点学习了Chromium产品是如何从代码和设计层面来保证快速高效的工程生产力。...

5168
来自专栏菩提树下的杨过

Gradle 10分钟上手指南

java的源码构建工具,大致经历了 ant -> maven -> gradle 这个过程,每一次进步,都是在解决之前的工具所带来的问题,简单来说: 1. an...

20610
来自专栏沃趣科技

ASM 翻译系列第一弹:基础知识 ASM AU,Extents,Mirroring 和 Failgroups

原作者:Bane Radulovic 译者: 魏兴华 审核: 魏兴华 ASM Allocation Units 在ASM磁盘组中,最基本空间分配单位...

3577
来自专栏编程一生

技术专家写代码-以点带面谈做开发

1592
来自专栏猫哥学前班

猫哥网络编程系列:详解 BAT 面试题

从产品上线前的接口开发和调试,到上线后的 bug 定位、性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期。不论你是前后端的开发岗位,还是 SQA、运维等...

47012
来自专栏即时通讯技术

移动端IM开发需要面对的技术问题

P2P多见于局域网内聊天工具,典型的应用有:飞鸽传书、天网Maze(你懂的)等。这类软件在启动后一般做两件事情:

1511

扫码关注云+社区

领取腾讯云代金券