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

前言

在实际项目中,曾经遭遇过线上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等去做。本文主要讨论的是单机的限流,这里就不在详细介绍分布式场景下的限流了。

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


本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/2066683,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ndk学习19: 使用Eclipse调试so

1. 设置调试选项在AndroidManifest文件加入允许调试android:debuggable"true" 此时编译项目会多出:2. 配置调试代码把需要调试的代码,放如按钮事件中,如果放在OnCreate会导致连接调试器时,代码已经跑完了Button btnTest (Button)findViewById(R.id.button1);btnT…

Inside the C++ Object Model | Outline

《Inside the C Object Model(C对象模型)》,这是一本灰常不错的书! CSDN下载页面(中文,侯捷译) 豆瓣评论 读书笔记目录如下(不定时更新): 转载于:https://www…

最优化课程笔记07——约束问题的非线性规划方法(重点:拉格朗日乘子法和惩罚函数法)

7.1 间接法:约束转化为无约束问题(含一个重点:拉格朗日乘子法) 当维数多的时候不适用 7.1.2拉格朗日乘子法(重点) 7.1.2.1 等式约束问题 7.1.2.2 不等式约束问题 7.1.3 惩罚函数法(内惩罚函数法…

工业相机:传感器尺寸与像元尺寸的关系

相同分辨率的工业相机,传感器面积越大,则其单位像素的面积也越大,成像质量也会越好。同样的500万像素的工业相机,2/3”的传感器成像质量就要优于1/2”的。一般来说,工业相机的靶面大小,如果要求不是太严格&…

macOS下安装ipython

macOS下sudo安装ipython,会提示限错误: [Errno 1] Operation not permitted: /tmp/pip-Elrhse-uninstall/System/Library... 解决方法: pip install ipython --user -U 参考: http://chaishiwei.com/blog/994.html 本文转自 h2app…

结构化查询语言包含哪些方面?

结构化查询语言SQL(STRUCTURED QUERY LANGUAGE)是最重要的关系数据库操作语言,并且它的影响已经超出数据库领域,得到其他领域的重视和采用,如人工智能领域的数据检索,第四代软件开发工具中嵌入SQL的语言等。…

Opencv 找轮廓并画出相应的矩形

找轮廓参考以下大神的,对于里面的方法和结果存储解释的很清楚; http://blog.csdn.net/gubenpeiyuan/article/details/44922413 缺少的是画相应包围矩形的,其中找矩形用最小外接矩形函数cvMinAreaRect2 。 CvBox2D rect; CvPoint2D32f Corner…

C# 图片识别(支持21种语言)

图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇总一下(C#实现),方便需要的朋友查阅,也给自己做个记号。 图片识别的用途:很多人用它去破解网站的验证码,用于达…

搭建Git Server - Centos+Gitosis

参考并部分转载自:http://www.pfeng.org/archives/757 1. 安装依赖 yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel git python python-setuptools2. 安装gitosis git clone git://github.com/res0nat0r/gitosis.git cd…

php中rsa加密及解密和签名及验签

加密的内容长度限制为密钥长度少11位,如128位的密钥最多加密的内容为117个长度。 公钥加密    $public_contentfile_get_contents(公钥路径);    $public_keyopenssl_get_publickey($public_content);        $original_str待加密的内容;    $original_arr…

Opencv ---像素坐标转世界坐标(已知外参)

只能求取已知外参的世界坐标平面上的世界坐标,具体公式如图片所示! PS:字丑请谅解!

最优化5-8章重点(考试点全)

10道题,每道题10分,5-8章大概4题左右,后面的章节主要考的是概念题

多对多关联映射(双向)

关联映射方面的最后一篇了,我觉得映射文件的编写是使用hibernate的基础,而关联映射又是基础的基础,所以这方面分的细一些,罗嗦一些,说明白就好,呵呵。多对多关联(双向),相对单向,在实…

sort-排座椅

题目描述 Description上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同学们在教室中…

JSONModel的基本使用

JSONModel 是一个库,它能智能并且快速的创建出数据 model,你可以在你的 iOS 项目或者 OSX 项目上使用它。 使用前准备 添加 JSONModel 到你的工程中 1、需要的环境: ARC,iOS 5.0 / OSX 10.7 引入框架SystemConfiguration.framework2、获取途径: 1)、通过…

图像处理 伽玛校正

http://blog.csdn.net/lichengyu/article/details/20840135 本质上是关于灰度的一个幂函数,当系数gamma大于1时,低灰度值的动态范围减小,高灰度值的动态范围增大,整体的灰度值减小;gamma小于1时则相反; 人…

matlab常用工具箱的调用指令

转自:http://blog.sina.com.cn/s/blog_86186c970102va9g.html Matlab常用工具箱的调用命令 1. 优化工具箱​​ 用途:优化问题 调用命令:在Command Window输入“optimtool”​,其窗口如下 图1 Optimization Tool 2. 神经网络工具箱​ 用途:数据拟合、模式识别和分类…

tomcat起不来的问题已经解决

tomcat 起不来的问题:\apache-tomcat-6.0.10\bin 中startup.bat 起不来,一闪就没了。说明:环境变量没有配置好。解决办法:配置环境变量:JAVA_HOME C:\Program Files\Java\jdk1.6.0_03就可以解决问题了本文转自 yuwenhu 51CTO博客…

js写法【3】

var m[];m[m.length]xx;//相当于push 对Repeat方法提供了8种写法做比较,这一点还是不错的。转载于:https://www.cnblogs.com/baozhu/p/4862242.html