21 限流不能乱用-系统限流最佳实践

没有引发任何行动的思想都不是思想,而是梦想。

—— 马丁

引言

19、20小节讲了系统中的降级熔断设计和对 Hystrix 组件的功能了解,关于限流降级还有一个比较重要的知识点就是限流算法。

如果你面试的是电商相关公司,这一块就显得更加重要了,秒杀、抢购等场景,需有一种手段来限制这些场景的并发/请求量,手段就是限流。

没有配置限流,如果遇到上游系统频繁调用,会导致下游系统被击垮。

配置了限流,但是限流算法不合理,会导致正常访问被拒绝,所以限流算法不能乱用,要充分评估系统是否需要限流,如果要限流,流量大小如何评估。

1.面试官:哪些场景系统使用了限流?为什么要使用限流?

问题分析:

这个问题比较简单,所有访问频繁的服务都可以做限流,相比公司内部运营系统,用户加起来不过十几个,这种系统就没必要限流了。

我:

限流呀,无非就是秒杀活动,或者容易被爬虫爬的信息类页面,以及系统核心服务,这些都需要做限流,比如大众点评首页,因为推荐了一些高质量店铺信息,经常被同行或者门户类公司的爬虫爬取信息,这个时候我们就要对首页做限流操作。秒杀活动,系统核心高QPS服务,都需要考虑限流。

使用限流的目的就是我们不能轻易被别人干倒,要7x24h保证服务正常,同时,限流也是为了我们的下游系统不会轻易被我们拖垮,流量合理放行。

2.面试官:那你了解哪些常用限流算法?

我:

常用的限流算法就3种:

1.计数器方法:

固定时间窗口,比如1min/1h,设置一个计数器统计单位时间内一个请求的访问量,超过计数器最大值,可以让请求放入等待队列 or 直接拒接访问,这种方法简单粗暴,但是易造成突刺现象。

2.漏斗算法:

可以理解成一个固定容量的漏桶,不管流量多还是少,我都按照常量固定速率流出水滴,如果流入水滴超出了桶的容量,就让水溢出。这种算法优点是稳定速率,缺点是无法面对突发流量。

图片来源:https://developpaper.com/

3.令牌桶算法:

让每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择等待可用的令牌,或者直接拒绝。优点是系统发放令牌的速率是可变的,能够面对突发流量,缺点是有点复杂。

具体使用哪种算法,要根据具体业务场景,比如系统时候会有突发流量,调用方重要程度等,如果调用方不是很重要,为了顾全大局,直接放调用方稍后重试。

图片来源:https://developpaper.com/

面试官:那具体这值该如何评估,说到现在我还是不知道限流到底要怎么设置,可以给我一点经验方法吗?

(我继续…)

对于核心服务限流的值可以通过以下方法来设置合理的值:

  • 观察评估法:系统总该有QPS监控系统吧,看看流量环比最大值,最小值,平均值,这就是很好的参考,总不能我一拍脑袋设置一个250上去。
  • 压力测试法:找QA,半夜业务低峰期,看看系统能承受的最大QPS。

同时,限流还有和重试、降级、熔断等作为组合方法一起使用。

面试官:get到你的思路了,看来确实是用过,这活儿交给你我就放心了。

深入分析

于具体使用的技术和工具并不是重点,还有人说我也不用Guava,也不用Thread sleep,更不用Hystrix,我用Nginx,前系统最前端同样可以做限流,方案可行,条条大路通罗马。
使用线程池实现:

@SpringBootTest
@RunWith(SpringRunner.class)
public class RejectTest {@Testpublic void testReject() {for (int i = 0; i < 25; ++i) {new Thread(() -> // do something     )).start();}// 防止主线程提前结束执行TimeUtils.sleep(50);}
}

借助Guava实现:

还记得《12.本地缓存Google Guava的使用》吗?它还有限流的功能。

RateLimiter rateLimiter = RateLimiter.create(20.0);
boolean token = rateLimiter.tryAcquire();
if (token) {System.out.println("pass");
} else {System.out.println("refuse");
}

总结

我认为学习限流最重要的点是掌握解决问题的思路,至于具体使用的技术和工具并不是重点,还有人说我也不用Guava,也不用Thread sleep,更不用Hystrix,我用Nginx,前系统最前端同样可以做限流,方案可行,条条大路通罗马。

面试精讲之面试考点及大厂真题 - 分布式专栏 21 限流不能乱用-系统限流最佳实践相关推荐

  1. 面试精讲之面试考点及大厂真题 - 分布式专栏 13项目中为什么要使用消息队列

    13项目中为什么要使用消息队列 学习从来无捷径,循序渐进登高峰. -- 高永祚 引言 上个章节把Redis夺命连环问掰扯完,面试还没有结束,消息队列同样是面试中必问的,分布式构建三把斧:缓存+异步+数 ...

  2. 面试精讲之面试考点及大厂真题 - 分布式专栏 01 开篇词:我是怎样带你通过大厂面试

    01 开篇词:我是怎样带你通过大厂面试 自信和希望是青年的特权. --大仲马 学习编程是一场修行,要经历从 0 到 1,普通人从自己的错误中学习,聪明人从别人的错误中学习. 授人以鱼不如授人以鱼杆儿, ...

  3. 面试精讲之面试考点及大厂真题 - 分布式专栏 07 说一说什么是正向代理,反向代理

    07 说一说什么是正向代理,反向代理 世界上最快乐的事,莫过于为理想而奋斗. --苏格拉底 引言 05小节面完了RPC相关的一系列问题,面试官确定我对分布式架构的理论知识和服务间通讯框架(RPC) 确 ...

  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题

    17 ElasticSearch解决大数据量检索难题 理想的书籍是智慧的钥匙. --列夫·托尔斯泰 引言 如果你的项目里有超过千万上亿级别的数据,且数据日增量较大需要高性能检索时,如订单数据,你该怎么 ...

  5. 面试精讲之面试考点及大厂真题 - 分布式专栏 22 分布式系统下调用链追踪技术

    22 分布式系统下调用链追踪技术 我们有力的道德就是通过奋斗取得物质上的成功:这种道德既适用于国家,也适用于个人. --罗素 引言 一个复杂的分布式系统,用户发起一个请求,这个请求可能调用几十到几百个 ...

  6. 面试精讲之面试考点及大厂真题 - 分布式专栏 03 阿里华为资深HR面试套路全揭晓

    03 阿里华为资深HR面试套路全揭晓 HR 面试套路大全 如果你技术面试过了,进入最后一轮 HR 谈薪资,先别高兴太早,千万不要轻视 HR.BAT 大公司,HR 有一票否决权,即使你技术 OK,领导也 ...

  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 23 分布式系统下分布式锁的实现

    23 分布式系统下分布式锁的实现 困难只能吓倒懦夫懒汉,而胜利永远属于敢于等科学高峰的人. --茅以升 引言 锁是开发过程中十分常见的工具,你一定不陌生,悲观锁,乐观锁,排它锁,公平锁,非公平锁等等, ...

  8. 面试精讲之面试考点及大厂真题 - 分布式专栏 18 谈谈怎么理解幂等,接口如何保证幂等

    18谈谈怎么理解幂等,接口如何保证幂等 时间像海绵里的水,只要你愿意挤,总还是有的. --鲁迅 引言 稳定性设计第一篇:这一小节开始讲设计系统稳定性保证的相关设计,谁都不想自己负责的系统三天两头就出故 ...

  9. 面试精讲之面试考点及大厂真题 - 分布式专栏 16 数据库如何做分库分表,读写分离

    16 数据库如何做分库分表,读写分离 宝剑锋从磨砺出,梅花香自苦寒来. --佚名 引言 2016年第一次接触分布式微服务项目后,我在简历上写了我使用了微服务.分库分表技术,那么问题来了,面试官说接下来 ...

最新文章

  1. LeetCode 508. Most Frequent Subtree Sum
  2. 设置tomcat 编译文件位置【转】
  3. Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序(三)
  4. MISC-BUUCTF-9题-九连环-佛系青年等
  5. 从零开始学视觉Transformer(1):Hello Vision Transformer
  6. Bella Email邮件发送模板
  7. 【转】STM32中的抢占优先级、响应优先级概念
  8. Java-时间复杂度和空间复杂度
  9. git相关常用基本用法命令及分支操作指南命令
  10. java多条件不定条件查询
  11. 报纸、电商、PC互联网颠覆传统行业,带来新的生态,自媒体也一样
  12. android 背景逐渐变暗,UI:使View背景逐渐变暗的方法
  13. Zend Studio9.02 字体显示,WIN7系统
  14. javacv使用笔记
  15. 怎么让计算机文件格式显示,怎么显示文件后缀名,详细教您如何让电脑显示文件后缀名...
  16. 高产攻关保全年粮丰 国稻种芯·中国水稻节:广西多措并举
  17. hp m281_惠普m281fdw驱动下载-hpm281fdw打印机驱动v44.3 官方版 - 极光下载站
  18. 详解 ARM PMU (Performance Monitoring Unit)
  19. 计算机上硬盘显示不出来怎么办,加装硬盘不显示怎么办_新硬盘装上去了但是没显示这么解决...
  20. 《联邦学习介绍》(科研汇报PPT,针对无机器学习基础的同学,浅显理解)

热门文章

  1. 检查xml文件中包含非法xml字符的个数(
  2. vs2010跟vs2008比较增加了哪些功能
  3. 如何在Ubuntu中屏蔽一个网站
  4. 概念性jQuery内容编辑器
  5. linux 命令行工具无敌斩
  6. 写你自己的MVC框架
  7. 人工智障学习笔记——深度学习(2)卷积神经网络
  8. 动态规划——How to Type(hdu2577)
  9. Python数据挖掘与分析常用库官方文档
  10. 从Linux服务器端下载文件Win客户端