高并发场景下的限流策略

转载自   高并发场景下的限流策略

在高并发的场景下,我们的优化和保护系统的方式通常有:多级缓存、资源隔离、熔断降级、限流等等。

今天我们来聊聊限流。

 

为什么需要限流

举个比较简单的例子,正常来说,一个员工A他每天能够处理的工作是10个,突然某一天来了100个工作量,这时候,如果员工A还处理100个,只有一种可能,这个员工被压垮。

如果我们能预先知道会有100个任务会来,我们通过增加员工数或定义消息队列等等来临时解决。

但是我们很多时候无法预料这些意外的。根据墨菲定律,坏事往往会接踵而来,有可能某个点挂了会引起全局的挂掉(雪崩)。因此我们不得不对我们的系统做一些保护措施。限流是其中之一。

针对秒杀这类场景,我们也可以做一些限流措施,而不影响到系统全局。

 

限流方式之计数器(滑动窗口协议)

思路:限速,我们可能第一个想到的应该是,我通过一个计数器,进行技术,如果超过了计数器阀值,表示速度太快了。一秒一个计数器。

为了便于阅读,我只截图了主要的代码片段。

这样有个问题就是:粒度太大了,不均匀,针对1秒以下的,没法辨析。

我们能不能把粒度拆细了,1秒拆成10个100毫秒。每一个100毫秒有一个计数器。了解TCP/IP的应该知道,TCP/IP为了增加传输速度和控制传输速度,有个叫“滑动窗口协议”。

就算拆得再细,也无法解决匀速限制速度的问题。

而且还有个临界点问题,假如,一秒限制10个请求,在第1秒和第2秒之间,第1秒后半段时间10个请求,第2秒前半段10个请求,那第1秒后半段+第2秒前半段时间组成的一秒钟里就有20个请求,没有起到限速的作用。

有没有更好的办法呢?

 

限速方式之漏桶算法

在生活中,如果一桶有一个细眼,我们往里面装水,可以看到水是一滴一滴匀速的下落的,哪我们能不能通过程序来实现这种方式呢。

思路:桶为容器,一滴水为一请求。如果桶满了就拒绝请求,没满处理请求。

代码片段

在段代码中

  • 首先计算这次请求与上次请求来的时候,总共漏了多少水。

  • 看一下桶里面还剩多少水,有没有溢出。

  • 如果溢出了拒绝请求,如果没有添加当前一滴水。处理请求。

对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。

什么意思呢?就是说我服务前面闲了很久,突然来了很多请求(在桶的容量内),我得快速的把这些处理了。

 

限速方式之令牌桶算法

思路:匀速的产生令牌,往桶里面丢,每次请求来,看是否有多余的令牌。如果有获取令牌执行正常业务,偌没有限速。

代码片段

通过这种方式可以允许瞬时的大量处理,然后做限速处理。

  • 请求来的时候先计算目前放入桶中的令牌数,这里计算,就可以不用启动一个线程匀速放置令牌了,这个叫惰性计算。

  • 然后计算桶拥有的令牌数。然后获取令牌。做拒绝还是处理动作。

以上代码,可在Github查看。
https://github.com/hirudy/java_lib/tree/master/src/main/java/com/hirudy/limiter 

 

单机限速器RateLimiter

安利大家一个高效的限速器。

google的基础库guava中包含了一个基于令牌桶的限速器RateLimiter。使用也很简单。

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

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

相关文章

Entity Framework Core 批处理语句

在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句。那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请求,它将在数据库的单次请求中批量执行多个语句。在这篇文章中&…

mybatis和spring整合时这个报错,应该这样解决!

01问题描述今天在写mybatis和spring整合的时候,出现了个问题,其实也没有多难,就是自己没有仔细看,特此记录一下。报错问题如下:org.springframework.beans.factory.BeanCreationException: Error creating bean with n…

P1496 vijos1165-火烧赤壁【离散化】

正题 题目链接: 洛谷:https://www.luogu.org/problemnew/show/P1496 vijos:https://vijos.org/p/1165 大意 有n艘被烧了的船,给出头坐标和尾坐标,求被烧了的位置的总长度。 解题思路 先用离散化。把船的头坐标排序…

一个简单的例子,学习自定义注解和AOP

转载自 一个简单的例子,学习自定义注解和AOP 记得今年年初刚开始面试的时候,被问的最多的就是你知道Spring的两大核心嘛?那你说说什么是AOP,什么是IOC?我相信你可能也被问了很多次了。 1、到底是什么是AOP&#xff…

Xamarin for iOS 11(一) - 初尝ARKit

编者语:Xamarin 的兼容性是它最大的优点,对于iOS / Android 新的功能支持也是无缝的,做到100%兼容。Xamarin.ios for iOS 11.0的支持已经开始,大家可以在这里下载最新的Preview支持 (https://releases.xamarin.com/preview-xcode-…

挺不喜欢下雪的

你要储蓄你的可爱,眷顾你的善良,变得勇敢。当这个世界越来越坏时,只希望你能越来越好。——《南山南》昨天夜间,窗外雪花飘飘,朋友圈中到处都是晒下雪的照片,有的说是“这是2020年的第一场雪”,…

【2018.4.21】模拟赛之一-ssl2402 世界语【水题】

正题 大意 就是将1到10改为 “unu”,”du”,”tri”,”kvar”,”kvin”,”ses”,”sep”,”ok”,”nau”,”dek” 然后如果是十几: 如12:”dek du” 如果是几十几: 如88:”dudek du” 解题思路 就是判断就好了,…

是什么使你留在你的公司

一个故事 之前离职的一个同事,是典型的技术型人才,前段时间跟他一起吃饭,得知他工作状况不是很理想(他在创业型团队,工作强度非常大,且做出来的东西得不到应有的认可,公司给他的报酬也不是很高…

有些事,父母一定不能依着孩子!

今天的文章,可能有的人不太喜欢。在我教学这么些年以来,这个问题在今年出现的最多——父母总是站在孩子的角度,不管什么事都是依着孩子;如果此事对孩子好也就罢辽,但是明明对孩子没有一点好处,还要和孩子一…

收割百度、阿里、腾讯、头条、网易华为等大厂Offer的面经

转载自 收割百度、阿里、腾讯、头条、网易华为等大厂Offer的面经 本文作者是跨专业考研的985硕士一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今…

【2018.4.21】模拟赛之二-ssl2403 蜡烛【贪心】

正题 大意 有n个蜡烛&#xff0c;第i个晚上要烧i根&#xff0c;没烧一个晚上蜡烛要消耗一个高度&#xff0c;求能烧多少个晚上。 解题思路 就是先烧高的&#xff0c;让剩下的蜡烛尽量多。 代码 #include<cstdio> #include<algorithm> using namespace std; int …

“看起来你每天都要做好多事,你有时间吗?”

“我看你每天要干的事好多啊,你有那么多时间吗?” “有啊,早起会儿,晚睡会儿,时间就出来了” 我每天确实是要做好多事。 01 我是一个喜欢规律生活的人,通常会将自己的一天划分为好多块,每一块时间安排的事都不一样,不太喜欢别人打乱我的生活规律,也不知道这是好事还是…

Sentinel限流保护

自定义限流错误页

浅谈 EF CORE 迁移和实例化的几种方式

出于学习和测试的简单需要&#xff0c;使用 Console 来作为 EF CORE 的承载程序是最合适不过的。今天笔者就将平时的几种使用方式总结成文&#xff0c;以供参考&#xff0c;同时也是给本人一个温故知新的机会。因为没有一个完整的脉络&#xff0c;所以也只是想起什么写点什么&a…

【2018.4.21】模拟赛之三-ssl2404 上学【深度优先搜索】

正题 大意 有n个点&#xff0c;m辆车&#xff0c;每辆车有开车时间&#xff0c;需要走多久和需要多少钱。求在t个时间单位内到达可以需要花掉的最少价格 解题思路 暴力搜索能过就对了 代码 #include<cstdio> #include<iostream> using namespace std; struct li…

Redis 高可用特性之 “持久化” 详解

转载自 Redis 高可用特性之 “持久化” 详解 在之前的文章中&#xff0c;介绍了《Redis的内存模型》&#xff0c;从这篇文章开始&#xff0c;将依次介绍 Redis 高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了 Redis 高…

这本书强烈推荐看看!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】今天&#xff0c;给大家推荐一本书《计算机是怎样跑起来的》&#xff0c;作者&#xff1a;矢泽久雄。也不知道它是怎么进入我的书架的&#xff0c;由于最近一直在看理财类的书籍&#xff0c;所以以前加入…

【2018.4.21】模拟赛之四-ssl2405 巧克力【实际上是模拟】

正题 大意 有n块巧克力&#xff0c;一个a*b的网格&#xff0c;如果网格可以完全包括一块巧克力就可以获得这块巧克力&#xff0c;求最多能获得的巧克力数量 解题思路 枚举点&#xff08;在巧克力上的&#xff09;和各种情况&#xff0c;然后判断这种情况包括多少个巧克力&…