高并发场景下的限流策略

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

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

今天我们来聊聊限流。

 

为什么需要限流

举个比较简单的例子,正常来说,一个员工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…

一个简单的例子,学习自定义注解和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年的第一场雪”,…

是什么使你留在你的公司

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

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

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

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

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

Sentinel限流保护

自定义限流错误页

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

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

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

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

这本书强烈推荐看看!

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

基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级

1、前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身份验证,限流降级等功能完…

1 分钟教会你用 Spring Boot 发邮件

转载自 1 分钟教会你用 Spring Boot 发邮件 Spring Boot 提供了一个发送邮件的简单抽象,使用的是下面这个接口。 org.springframework.mail.javamail.JavaMailSender Spring Boot 提供了一个 starter,并能自动配置,下面来做个小例子&#xf…

小二,先来两桂花豆沙包!

“包子嘞,卖包子嘞,新出锅的大包子,走过路过千万不要错过呦~包子嘞……”某年某月某下午,百万包子铺进来一人,进来便招呼:“小二,包子怎么卖?”小二:“客官,你…

SQL Server 2017 RC1 现已实现 Linux 功能扩展

经过七个预览版本的迭代之后,Microsoft 宣告发布第一个 SQL Server 2017 候选版本。开发人员可以藉由该版本来探索一些扩展 SQL Server Linux 版能力的新改进。 在这些新改进中,首先是对 Linux 上SQL Server 的 Active Directory 身份验证的支持。使用 …

一百馒头一百僧,大僧三个更无争,小僧三人分一个大小和尚得几丁?

如题&#xff1a;一百馒头一百僧&#xff0c;大僧三个更无争&#xff0c;小僧三人分一个大小和尚得几丁&#xff1f; 要求使用java实现求得大僧小僧各有多少人&#xff1f; public class shdjshj {public static void main(String[] args) {for(int i 1;i<100;i){int j 1…