面试精讲之面试考点及大厂真题 - 分布式专栏 21 限流不能乱用-系统限流最佳实践
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 限流不能乱用-系统限流最佳实践相关推荐
- 面试精讲之面试考点及大厂真题 - 分布式专栏 13项目中为什么要使用消息队列
13项目中为什么要使用消息队列 学习从来无捷径,循序渐进登高峰. -- 高永祚 引言 上个章节把Redis夺命连环问掰扯完,面试还没有结束,消息队列同样是面试中必问的,分布式构建三把斧:缓存+异步+数 ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 01 开篇词:我是怎样带你通过大厂面试
01 开篇词:我是怎样带你通过大厂面试 自信和希望是青年的特权. --大仲马 学习编程是一场修行,要经历从 0 到 1,普通人从自己的错误中学习,聪明人从别人的错误中学习. 授人以鱼不如授人以鱼杆儿, ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 07 说一说什么是正向代理,反向代理
07 说一说什么是正向代理,反向代理 世界上最快乐的事,莫过于为理想而奋斗. --苏格拉底 引言 05小节面完了RPC相关的一系列问题,面试官确定我对分布式架构的理论知识和服务间通讯框架(RPC) 确 ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题
17 ElasticSearch解决大数据量检索难题 理想的书籍是智慧的钥匙. --列夫·托尔斯泰 引言 如果你的项目里有超过千万上亿级别的数据,且数据日增量较大需要高性能检索时,如订单数据,你该怎么 ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 22 分布式系统下调用链追踪技术
22 分布式系统下调用链追踪技术 我们有力的道德就是通过奋斗取得物质上的成功:这种道德既适用于国家,也适用于个人. --罗素 引言 一个复杂的分布式系统,用户发起一个请求,这个请求可能调用几十到几百个 ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 03 阿里华为资深HR面试套路全揭晓
03 阿里华为资深HR面试套路全揭晓 HR 面试套路大全 如果你技术面试过了,进入最后一轮 HR 谈薪资,先别高兴太早,千万不要轻视 HR.BAT 大公司,HR 有一票否决权,即使你技术 OK,领导也 ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 23 分布式系统下分布式锁的实现
23 分布式系统下分布式锁的实现 困难只能吓倒懦夫懒汉,而胜利永远属于敢于等科学高峰的人. --茅以升 引言 锁是开发过程中十分常见的工具,你一定不陌生,悲观锁,乐观锁,排它锁,公平锁,非公平锁等等, ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 18 谈谈怎么理解幂等,接口如何保证幂等
18谈谈怎么理解幂等,接口如何保证幂等 时间像海绵里的水,只要你愿意挤,总还是有的. --鲁迅 引言 稳定性设计第一篇:这一小节开始讲设计系统稳定性保证的相关设计,谁都不想自己负责的系统三天两头就出故 ...
- 面试精讲之面试考点及大厂真题 - 分布式专栏 16 数据库如何做分库分表,读写分离
16 数据库如何做分库分表,读写分离 宝剑锋从磨砺出,梅花香自苦寒来. --佚名 引言 2016年第一次接触分布式微服务项目后,我在简历上写了我使用了微服务.分库分表技术,那么问题来了,面试官说接下来 ...
最新文章
- LeetCode 508. Most Frequent Subtree Sum
- 设置tomcat 编译文件位置【转】
- Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序(三)
- MISC-BUUCTF-9题-九连环-佛系青年等
- 从零开始学视觉Transformer(1):Hello Vision Transformer
- Bella Email邮件发送模板
- 【转】STM32中的抢占优先级、响应优先级概念
- Java-时间复杂度和空间复杂度
- git相关常用基本用法命令及分支操作指南命令
- java多条件不定条件查询
- 报纸、电商、PC互联网颠覆传统行业,带来新的生态,自媒体也一样
- android 背景逐渐变暗,UI:使View背景逐渐变暗的方法
- Zend Studio9.02 字体显示,WIN7系统
- javacv使用笔记
- 怎么让计算机文件格式显示,怎么显示文件后缀名,详细教您如何让电脑显示文件后缀名...
- 高产攻关保全年粮丰 国稻种芯·中国水稻节:广西多措并举
- hp m281_惠普m281fdw驱动下载-hpm281fdw打印机驱动v44.3 官方版 - 极光下载站
- 详解 ARM PMU (Performance Monitoring Unit)
- 计算机上硬盘显示不出来怎么办,加装硬盘不显示怎么办_新硬盘装上去了但是没显示这么解决...
- 《联邦学习介绍》(科研汇报PPT,针对无机器学习基础的同学,浅显理解)