高并发流量控制与算法实现思路

前言

​ 昨天看了一篇关于高并发流量控制的文章,感觉对我启发非常的大,所以写一篇记录总结一下,方便于以后我自己的学习与复盘。

简介

  • 首先要知道什么是大流量

    ​ 听到大流量,我们首先可能会冒出:TPS(每秒事物量),QPS(每秒请求量),其实并没有一个绝对的数字,如果这一个流量对系统造成了压力,影响了系统的正常运行与性能,那么这个量就可以称之为大流量了。

  • 应对大流量的一些手段

    • 缓存 :说白一点,就是让数据尽早的进入缓存,离缓存近一点,不要大量的频繁访问数据库。
    • 降级 :如果不是核心的链路,那么就把这个服务降级,打个比喻,现在的网站或者app都是动态页面,千人千面,每个人看到的也许都不一样,例如商城的商品推荐等等,所以在大流量的冲击下,可以把这个服务降级,从而提高核心服务的响应速度
    • 限流 :如果服务器在一段时间内承受的流量超过了服务器的承受能力,可能会造成系统的崩塌,所以我们可以在一个时间段内规定访问请求的数量,将流量控制在一个服务器能接受的范围内,同时尽可能的提升系统的吞吐量

    注意到,有些时候,缓存的降级是解决不了问题的,就比如说,电商的双十一,用户的购买行为等,都是设计到大量的数据库写入操作,而且都是核心链路,没有办法降级,这个时候限流就显得非常的重要

限流的方法

  • 计数器

    计数器是一种比较简单的限流算法,用于非常的广泛,在接口层面,很多地方使用这种方式限流,思路就是:在一段时间里面,进行技术,与阀值进行一个比较,到了时间的临界点九江计数器清零

代码实现

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

  • 滑动窗口

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

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

  • 漏桶

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

    算法思路:存在一个固定的桶,进水的速率不确定,但是出水的速率是恒定的,当水满的时候就会溢出

​ 代码实现:

​ 缺点:漏桶的出水速度是恒定的,那么就是说如果瞬时大流量的话,会有很大一部分请求被丢失掉(就是所谓的溢出)

  • 令牌桶

    为了解决漏桶算法的缺陷,出现了一个令牌桶的概念,本质是在漏桶算法上的改良

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

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

​ 代码实现:

结尾

上面所说的限流的一些方式,都是针对单机而言的,其实大部分的场景,单机的限流已经足够了。

ps:本文非原创,原文出自与微信公众号:java面试那些事儿

高并发流量控制与算法实现思路相关推荐

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

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

  2. 对高并发流量控制的一点思考 推荐

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

  3. 解决redis高并发问题的几种思路

    解决redis高并发问题的几种思路 1:布隆过滤器 首先,布隆过滤器能解决绝大部分恶意攻击的请求,比如我们数据库中的id通常都设为自增的,是有一定范围大小的,如果有黑客恶意用数据库中没有的id一直访问 ...

  4. 搞懂分布式技术30:高并发解决方案——提升高并发量服务器性能解决思路

    高并发解决方案--提升高并发量服务器性能解决思路 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很 ...

  5. 高并发解决方案——提升高并发量服务器性能解决思路

    一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过 ...

  6. 哎呀,你对高并发与多线程的解决思路了解的还挺深!

    一.大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战.如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态.我们现在 ...

  7. 千呼万唤,高并发限流算法之漏桶令牌桶来了!

    等啊等,盼啊盼,11月份终于来了,在11月01日的00:00分,你可以清空掉所有的预售订单,还有购买商家所推出的限时折扣如前十五分钟购买5折等,买的人很开心,商家也很开心.然而程序员们不开心了,提供应 ...

  8. 高并发大流量秒杀方案思路

    概念:什么是秒杀 秒杀场景一般会在电商举行一些活动或者节假日在12306网站上抢票时遇到.对于网站中一些稀缺或者特价的产品,电商网站一般会在约定的时间对其进行限量销售,因为这些产品的特殊性,会吸引大量 ...

  9. 一个高并发请求的算法

    这个算法以前在网络游戏开发时服务端常用,需要有一些前提条件.假设你的并发请求每秒钟少于一万(当然这还取决于你的服务器性能,如果你的服务器性能(含数据库)每秒可以处理的多,那么这个值就会高),并且假设高 ...

最新文章

  1. c++ 编译添加dll_linux下编写C/C++代码须知———串讲
  2. Python 中strip()方法怎么用?
  3. ElasticSearch 相关性
  4. python 写excel 保留空格_通过自动填充列中的空格来操作excel表的Python脚本
  5. matlab中怎样绘制离散点,matlab中怎么绘制大量的离散点
  6. IT项目实施管理办法
  7. CSS实现标题样式(自用笔记)
  8. linux权限不够的简易解决方法
  9. 一个Node程序猿上海的一周
  10. oracle的listener监听启动报TNS-12555/ TNS-12560 TNS-00525错误
  11. WPS JASPI调试器打开 WPS重要路径
  12. 高校计算机课程建设研讨会通知,大学计算机教改与课程建设研讨会召开
  13. 【1059】求平均年龄
  14. 爱数异机恢复Oracle实例
  15. php云签到,云签到之DiscuzX系列论坛自动签到
  16. python画蛋糕祝福_python实现生日蛋糕
  17. CC2541 OAD升级实现
  18. 游戏模型模糊高亮边缘效果实现shader
  19. scrapy的爬虫类总结
  20. 利用VS2015与FFmpeg实现视频解编码的基本过程

热门文章

  1. koa-onerror 使用教程
  2. Pjax加持APlayer,音乐无间断
  3. 艾司博讯:拼多多退款率过高会影响权重吗
  4. 好心情:哀伤是最深刻的爱,如何抚平离别之痛?
  5. 兄弟8400cdn耗材_兄弟l8400cdn驱动下载
  6. SVO深度解析(二)之跟踪部分
  7. Tensorflow 2.x(keras)源码详解之第十一章:keras损失函数及自定义损失函数
  8. 关于共享单车的胡言乱语
  9. java leftshift,Java BigInteger shiftLeft()用法及代码示例
  10. 日本KDDI与高速巴士公司共同推出包月打车服务