左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家,骨灰级程序员
立即订阅
40357 人已学习
课程目录
已完结 108 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 | 洞悉技术的本质,享受科技的乐趣
免费
01 | 程序员如何用技术变现(上)
02 | 程序员如何用技术变现(下)
03 | Equifax信息泄露始末
04 | 从Equifax信息泄露看数据安全
05 | 何为技术领导力?
06 | 如何才能拥有技术领导力?
07 | 推荐阅读:每个程序员都该知道的知识
08 | Go语言,Docker和新技术
09 | 答疑解惑:渴望、热情和选择
10 | 如何成为一个大家愿意追随的Leader?
11 | 程序中的错误处理:错误返回码和异常捕捉
12 | 程序中的错误处理:异步编程以及我的最佳实践
13 | 魔数 0x5f3759df
14 | 推荐阅读:机器学习101
15 | 时间管理:同扭曲时间的事儿抗争
16 | 时间管理:如何利用好自己的时间?
17 | 故障处理最佳实践:应对故障
18 | 故障处理最佳实践:故障改进
19 | 答疑解惑:我们应该能够识别的表象和本质
20 | Git协同工作流,你该怎么选?
21 | 分布式系统架构的冰与火
22 | 从亚马逊的实践,谈分布式系统的难点
23 | 分布式系统的技术栈
24 | 分布式系统关键技术:全栈监控
25 | 分布式系统关键技术:服务调度
26 | 分布式系统关键技术:流量与数据调度
27 | 洞悉PaaS平台的本质
28 | 推荐阅读:分布式系统架构经典资料
29 | 推荐阅读:分布式数据调度相关论文
30 | 编程范式游记(1)- 起源
31 | 编程范式游记(2)- 泛型编程
32 | 编程范式游记(3) - 类型系统和泛型的本质
33 | 编程范式游记(4)- 函数式编程
34 | 编程范式游记(5)- 修饰器模式
35 | 编程范式游记(6)- 面向对象编程
36 | 编程范式游记(7)- 基于原型的编程范式
37 | 编程范式游记(8)- Go 语言的委托模式
38 | 编程范式游记(9)- 编程的本质
39 | 编程范式游记(10)- 逻辑编程范式
40 | 编程范式游记(11)- 程序世界里的编程范式
41 | 弹力设计篇之“认识故障和弹力设计”
42 | 弹力设计篇之“隔离设计”
43 | 弹力设计篇之“异步通讯设计”
44 | 弹力设计篇之“幂等性设计”
45 | 弹力设计篇之“服务的状态”
46 | 弹力设计篇之“补偿事务”
47 | 弹力设计篇之“重试设计”
48 | 弹力设计篇之“熔断设计”
49 | 弹力设计篇之“限流设计”
50 | 弹力设计篇之“降级设计”
51 | 弹力设计篇之“弹力设计总结”
52 | 管理设计篇之“分布式锁”
53 | 管理设计篇之“配置中心”
54 | 管理设计篇之“边车模式”
55 | 管理设计篇之“服务网格”
56 | 管理设计篇之“网关模式”
57 | 管理设计篇之“部署升级策略”
58 | 性能设计篇之“缓存”
59 | 性能设计篇之“异步处理”
60 | 性能设计篇之“数据库扩展”
61 | 性能设计篇之“秒杀”
62 | 性能设计篇之“边缘计算”
63 | 区块链技术的本质
64 | 区块链技术细节:哈希算法
65 | 区块链技术细节:加密和挖矿
66 | 区块链技术细节:去中心化的共识机制
67 | 区块链技术细节:智能合约
68 | 区块链技术 - 传统金融和虚拟货币
69 | 程序员练级攻略:开篇词
70 | 程序员练级攻略:零基础启蒙
71 | 程序员练级攻略:正式入门
72 | 程序员练级攻略:程序员修养
73 | 程序员练级攻略:编程语言
74 | 程序员练级攻略:理论学科
75 | 程序员练级攻略:系统知识
76 | 程序员练级攻略:软件设计
77 | 程序员练级攻略:Linux系统、内存和网络
78 | 程序员练级攻略:异步I/O模型和Lock-Free编程
79 | 程序员练级攻略:Java底层知识
80 | 程序员练级攻略:数据库
81 | 程序员练级攻略:分布式架构入门
82 | 程序员练级攻略:分布式架构经典图书和论文
83 | 程序员练级攻略:分布式架构工程设计
84 | 程序员练级攻略:微服务
85 | 程序员练级攻略:容器化和自动化运维
86 | 程序员练级攻略:机器学习和人工智能
87 | 程序员练级攻略:前端基础和底层原理
88 | 程序员练级攻略:前端性能优化和框架
89 | 程序员练级攻略:UI/UX设计
90 | 程序员练级攻略:技术资源集散地
91 | 程序员面试攻略:面试前的准备
92 | 程序员面试攻略:面试中的技巧
93 | 程序员面试攻略:面试风格
94 | 程序员面试攻略:实力才是王中王
95 | 高效学习:端正学习态度
96 | 高效学习:源头、原理和知识地图
97 | 高效学习:深度,归纳和坚持实践
98 | 高效学习:如何学习和阅读代码
99 | 高效学习:面对枯燥和量大的知识
左耳听风
登录|注册

49 | 弹力设计篇之“限流设计”

陈皓 2018-03-20
保护系统不会在过载的情况下出现问题,我们就需要限流。
我们在一些系统中都可以看到这样的设计,比如,我们的数据库访问的连接池,还有我们的线程池,还有 Nginx 下的用于限制瞬时并发连接数的 limit_conn 模块,限制每秒平均速率的 limit_req 模块,还有限制 MQ 的生产速,等等。

限流的策略

限流的目的是通过对并发访问进行限速,相关的策略一般是,一旦达到限制的速率,那么就会触发相应的限流行为。一般来说,触发的限流行为如下。
拒绝服务。把多出来的请求拒绝掉。一般来说,好的限流系统在受到流量暴增时,会统计当前哪个客户端来的请求最多,直接拒掉这个客户端,这种行为可以把一些不正常的或者是带有恶意的高并发访问挡在门外。
服务降级。关闭或是把后端服务做降级处理。这样可以让服务有足够的资源来处理更多的请求。降级有很多方式,一种是把一些不重要的服务给停掉,把 CPU、内存或是数据的资源让给更重要的功能;一种是不再返回全量数据,只返回部分数据。
因为全量数据需要做 SQL Join 操作,部分的数据则不需要,所以可以让 SQL 执行更快,还有最快的一种是直接返回预设的缓存,以牺牲一致性的方式来获得更大的性能吞吐。
特权请求。所谓特权请求的意思是,资源不够了,我只能把有限的资源分给重要的用户,比如:分给权利更高的 VIP 用户。在多租户系统下,限流的时候应该保大客户的,所以大客户有特权可以优先处理,而其它的非特权用户就得让路了。
延时处理。在这种情况下,一般会有一个队列来缓冲大量的请求,这个队列如果满了,那么就只能拒绝用户了,如果这个队列中的任务超时了,也要返回系统繁忙的错误了。使用缓冲队列只是为了减缓压力,一般用于应对短暂的峰刺请求。
弹性伸缩。动用自动化运维的方式对相应的服务做自动化的伸缩。这个需要一个应用性能的监控系统,能够感知到目前最繁忙的 TOP 5 的服务是哪几个。
然后去伸缩它们,还需要一个自动化的发布、部署和服务注册的运维系统,而且还要快,越快越好。否则,系统会被压死掉了。当然,如果是数据库的压力过大,弹性伸缩应用是没什么用的,这个时候还是应该限流。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《左耳听风》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(30)

  • LI
    文章都很好,就是缺少代码落地,看起来很理论
    2018-05-25
    2
    15
  • 张乐乐
    我们动态限流一般是根据资源来进行的,CPU/内存/带宽,存储对于出流部件可以转为带宽。根据响应时间来限流这个想起来比较难实施,后面再研究下。
    此外,限流也可以考虑做多级,不同阶段不同的阈值限制,分层去限制,比如操作体统OS层,链接处理,业务处理。
    也需要,考虑针对异常用户的识别限制,很多时候,一个异常用户带来的影响会特别大。
    2018-04-12
    1
    4
  • 权乐观
    感觉漏斗是最弱鸡的队列啊
    2018-04-01
    3
  • Star
    熔断是限流的一种怎么理解?能不能描述一下熔断和限流的关键区别?
    2018-10-19
    2
  • 松花皮蛋me
    老师好,请问下微信红包退还是怎么设计的,如果使用redis过期通知,订阅者下线再连接期间过期的信息不过再通知
    2018-03-20
    2
  • 力挽狂澜爆炸输出的臭臭宁
    看完后有两个问题:
    1.漏桶是不是就是一个一级队列?

    2.令牌桶和漏桶有什么实质性的区别?
    假设处理器的处理速度是100个请求/每秒,所以令牌桶中令牌的投放速度是100个令牌/每秒,假设令牌桶的大小为50,也就是说最多积压50个令牌;
    假设现在突然流量变大,以300个请求/每秒的速度产生请求;
    对于漏桶算法,因为出口速度是不变的,所以不论请求速度是多少,处理速度都是100/s;
    对于令牌桶算法,由于令牌桶中可以积压一定的令牌,所以在流量涌入的第一秒,令牌桶的请求处理速度可以达到150/s,之后都是100/s;
    这样分析对吗?如果按这样分析的话,令牌桶和漏桶的区别就在于请求涌入的第一秒的处理速度,这个不同有什么意义呢?只在流量涌入的第一秒多处理50个请求能有什么收益呢?
    2018-12-28
    1
  • A圆规
    最好有代码落地,有点书本。
    2018-05-31
    1
  • 李志博
    期待加防刷设计
    2018-04-12
    1
  • 华烬
    期待秒杀的文章,不过好像要等挺久的

    作者回复: 是的,中间还会有区块链加塞

    2018-03-21
    1
  • shufang
    限流看着怎么有点像熔断?

    作者回复: 我反而觉得熔断是限流的一种😏

    2018-03-20
    1
    1
  • junshuaizhang
    mark
    2019-12-08
  • Geek_09c245
    建议留言要代码的同学们,参考阿里Sentinel
    2019-11-13
  • 今天我又逃课了
    tcp维加斯算法就可以做限流
    2019-10-04
  • 布小丫学编程
    限流机制:使用Hystrix的相关配置,只对部分接口进行了限流,没有对所有的接口。比如在一些点赞上加一些限流。直接使用hystrix的相关注解实现。
    2019-08-31
  • 张稀虹
    “我们就知道有多少请求大于某个响应时间。如果这个 P90 或 P99 超过我们设定的阈值,那么我们就自动限流。” 这句话中还是提到了一个“阈值”,这个值很难去评估。如果是类似TCP Vegas算法那样,那这个阈值是过去的最小rt,但是实际使用中容易出现误限,在服务无法恢复到之前的最小rt水平时还会导致流量跌零。 老师能否给出一些更具体的实现讲解?
    2019-08-10
  • edisonhuang
    限流算法的设计应该在系统设计的早期就引入,它让我们的系统可以以相对较低的成本来应对突发的情况,保证大流量下用户的可用性。
    限流的策略包括拒绝服务,服务降级,特权服务,服务队列缓存等,这好比我们人对事物的处理,当我们发现自己活太多,活太重时,就只好挑重要的优先的来干,干不过来的就排期留着以后做,实在扛不住就拒绝服务休息一下也是保证不被压垮也是对的。
    限流的算法包括计数器算法,队列算法,漏斗算法以及限制token算法等
    2019-07-11
  • 涛哥迷妹
    限流应该让后端的服务感知到。限流发生时,我们应该在协议头中塞进一个标识,比如 HTTP Header 中,放入一个限流的级别,告诉后端服务目前正在限流中。这样,后端服务可以根据这个标识决定是否做降级。 -> 难道不是后端服务做限流处理,后端服务先感知到限流操作,可以打标记返回到前端,但是不清楚前端再将标记传回后端有何意义?
    2019-06-24
  • Brave Shine
    令牌桶令我想起了istio限流的quota
    2019-06-13
  • golangboy
    老师,可以说一下dlm锁吗?
    2019-06-07
  • .
    前辈你好:
    “队列算法
    在这个算法下,请求的速度可以是波动的,而处理的速度则是非常均速的。这个算法其实有点像一个 FIFO 的算法。”,这段中的“均速”,是不是“匀速”?“均速”也意味着某段时间内的速度是变化的。
    2019-05-28
收起评论
30
返回
顶部