对高并发流量控制的一点思考

2018 年 2 月 12 日 架构文摘 zfz_linux_boy

【前言】在实际项目中,曾经遭遇过线上5W+QPS的峰值,也在压测状态下经历过10W+QPS的大流量请求,本篇博客的话题主要就是自己对高并发流量控制的一点思考。


应对大流量的一些思路


首先,我们来说一下什么是大流量?


大流量,我们很可能会冒出:TPS(每秒事务量),QPS(每秒请求量),1W+,5W+,10W+,100W+...。其实并没有一个绝对的数字,如果这个量造成了系统的压力,影响了系统的性能,那么这个量就可以称之为大流量了。


其次,应对大流量的一些常见手段是什么?


缓存:说白了,就是让数据尽早进入缓存,离程序近一点,不要大量频繁的访问DB。


降级:如果不是核心链路,那么就把这个服务降级掉。打个比喻,现在的APP都讲究千人千面,拿到数据后,做个性化排序展示,如果在大流量下,这个排序就可以降级掉!


限流:大家都知道,北京地铁早高峰,地铁站都会做一件事情,就是限流了!想法很直接,就是想在一定时间内把请求限制在一定范围内,保证系统不被冲垮,同时尽可能提升系统的吞吐量。


注意到,有些时候,缓存和降级是解决不了问题的,比如,电商的双十一,用户的购买,下单等行为,是涉及到大量写操作,而且是核心链路,无法降级的,这个时候,限流就比较重要了。


那么接下来,我们重点说一下,限流。


限流的常用方式


限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌。


计数器


计数器是一种比较简单的限流算法,用途比较广泛,在接口层面,很多地方使用这种方式限流。在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0。




这里需要注意的是,存在一个时间临界点的问题。举个栗子,在12:01:00到12:01:58这段时间内没有用户请求,然后在12:01:59这一瞬时发出100个请求,OK,然后在12:02:00这一瞬时又发出了100个请求。这里你应该能感受到,在这个临界点可能会承受恶意用户的大量请求,甚至超出系统预期的承受。


滑动窗口


由于计数器存在临界点缺陷,后来出现了滑动窗口算法来解决。




滑动窗口的意思是说把固定时间片,进行划分,并且随着时间的流逝,进行移动,这样就巧妙的避开了计数器的临界点问题。也就是说这些固定数量的可以移动的格子,将会进行计数判断阀值,因此格子的数量影响着滑动窗口算法的精度。


漏桶


虽然滑动窗口有效避免了时间临界点的问题,但是依然有时间片的概念,而漏桶算法在这方面比滑动窗口而言,更加先进。


有一个固定的桶,进水的速率是不确定的,但是出水的速率是恒定的,当水满的时候是会溢出的。




令牌桶


注意到,漏桶的出水速度是恒定的,那么意味着如果瞬时大流量的话,将有大部分请求被丢弃掉(也就是所谓的溢出)。为了解决这个问题,令牌桶进行了算法改进。



生成令牌的速度是恒定的,而请求去拿令牌是没有速度限制的。这意味,面对瞬时大流量,该算法可以在短时间内请求拿到大量令牌,而且拿令牌的过程并不是消耗很大的事情。(有一点生产令牌,消费令牌的意味)


不论是对于令牌桶拿不到令牌被拒绝,还是漏桶的水满了溢出,都是为了保证大部分流量的正常使用,而牺牲掉了少部分流量,这是合理的,如果因为极少部分流量需要保证的话,那么就可能导致系统达到极限而挂掉,得不偿失。



限流神器:Guava RateLimiter


Guava不仅仅在集合、缓存、异步回调等方面功能强大,而且还给我们封装好了限流的API!


Guava RateLimiter基于令牌桶算法,我们只需要告诉RateLimiter系统限制的QPS是多少,那么RateLimiter将以这个速度往桶里面放入令牌,然后请求的时候,通过tryAcquire()方法向RateLimiter获取许可(令牌)。



分布式场景下的限流


上面所说的限流的一些方式,都是针对单机而言的,其实大部分的场景,单机的限流已经足够了。分布式下限流的手段常常需要多种技术相结合,比如Nginx+Lua,Redis+Lua等去做。本文主要讨论的是单机的限流,这里就不在详细介绍分布式场景下的限流了。

一句话,让系统的流量,先到队列中排队、限流,不要让流量直接打到系统上。


出处:http://blog.51cto.com/zhangfengzhe/2066683


版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。



架构文摘

ID:ArchDigest

互联网应用架构丨架构技术丨大型网站丨大数据丨机器学习

更多精彩文章,请点击下方:阅读原文

登录查看更多
0

相关内容

滑动窗口概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但基本原理是相近的。其中一个重要区别是,一个是针对于帧的传送,另一个是字节数据的传送。
【ICML2020】对比多视角表示学习
专知会员服务
52+阅读 · 2020年6月28日
少标签数据学习,54页ppt
专知会员服务
198+阅读 · 2020年5月22日
人机对抗智能技术
专知会员服务
201+阅读 · 2020年5月3日
【北京大学】面向5G的命名数据网络物联网研究综述
专知会员服务
37+阅读 · 2020年4月26日
Python数据分析:过去、现在和未来,52页ppt
专知会员服务
99+阅读 · 2020年3月9日
模型压缩究竟在做什么?我们真的需要模型压缩么?
专知会员服务
27+阅读 · 2020年1月16日
阿里巴巴全球化架构设计挑战
InfoQ
35+阅读 · 2019年11月25日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
主流互联网平台广告业务对比分析
百度公共政策研究院
29+阅读 · 2019年5月20日
专访阿里亚顿:Serverless与BFF与前端
前端之巅
45+阅读 · 2019年5月8日
2019,再不做私域流量就晚了?
互联网er的早读课
16+阅读 · 2019年4月10日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
机器学习(16)之支持向量机原理(二)软间隔最大化
机器学习算法与Python学习
6+阅读 · 2017年9月8日
有了场景和画像才懂用户
互联网er的早读课
6+阅读 · 2017年8月26日
谈谈用户画像
caoz的梦呓
10+阅读 · 2017年8月17日
Object detection on aerial imagery using CenterNet
Arxiv
6+阅读 · 2019年8月22日
VIP会员
相关VIP内容
【ICML2020】对比多视角表示学习
专知会员服务
52+阅读 · 2020年6月28日
少标签数据学习,54页ppt
专知会员服务
198+阅读 · 2020年5月22日
人机对抗智能技术
专知会员服务
201+阅读 · 2020年5月3日
【北京大学】面向5G的命名数据网络物联网研究综述
专知会员服务
37+阅读 · 2020年4月26日
Python数据分析:过去、现在和未来,52页ppt
专知会员服务
99+阅读 · 2020年3月9日
模型压缩究竟在做什么?我们真的需要模型压缩么?
专知会员服务
27+阅读 · 2020年1月16日
相关资讯
阿里巴巴全球化架构设计挑战
InfoQ
35+阅读 · 2019年11月25日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
主流互联网平台广告业务对比分析
百度公共政策研究院
29+阅读 · 2019年5月20日
专访阿里亚顿:Serverless与BFF与前端
前端之巅
45+阅读 · 2019年5月8日
2019,再不做私域流量就晚了?
互联网er的早读课
16+阅读 · 2019年4月10日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
机器学习(16)之支持向量机原理(二)软间隔最大化
机器学习算法与Python学习
6+阅读 · 2017年9月8日
有了场景和画像才懂用户
互联网er的早读课
6+阅读 · 2017年8月26日
谈谈用户画像
caoz的梦呓
10+阅读 · 2017年8月17日
Top
微信扫码咨询专知VIP会员