架构设计之「服务限流」

原文:架构设计之「服务限流」

上一篇我们聊过了架构设计中的「服务隔离」模式,今天我们继续来探索一下在分布式系统架构中的另一个常用的设计:服务限流。
那么,什么是「服务限流」呢? 
在解释「服务限流」之前,我们来看一下前些时间网上很火的一个段子,说的是新浪微博的一名工程师正在家里办婚礼,突然接到公司的电话要紧急处理线上流量激增的问题,那天应该是某当红明星突然在微博上公布恋情,微博流量突增好几倍,导致系统功能出现不稳定,用户访问不畅。然后这名工程师就只好晾开新娘,在婚礼现场穿着西装打开笔记本调试代码了。
当时这名工程师内心肯定是崩溃的,肯定在想:为啥要在今天公布恋情!等我把系统的扩容和服务限流机制做好先啊。
哈哈,看完了段子,基本上服务限流的作用也就明白: 
服务限流其实是指当系统资源不够,不足以应对大量请求,即系统资源与访问量出现矛盾的时候,我们为了保证有限的资源能够正常服务,因此对系统按照预设的规则进行流量限制或功能限制的一种方法。

一、为什么要做服务限流设计?
再举一个我们生活中的例子:一些热门的旅游景点,往往会对每日的旅游参观人数有严格的限制,比如厦门的鼓浪屿、北京的故宫等,每天只会卖出固定数目的门票,如果你去的晚了,可能当天的票就已经卖完了,当天就无法进去游玩了。
为什么旅游景点要做这样的限制呢?多卖一些门票多赚一些钱岂不是更好?
其实对于旅游景点而言,她们也很无奈,因为景点的服务资源有限嘛,每日能服务的人数是有限的,一旦放开限制了,景点的工作人员就会不够用,卫生情况也得不到保障,安全也有隐患,超密集的人群也会严重的影响游客的体验。 
但由于景区名气大,来游玩的旅客络绎不绝,远超出了景区的承载能力,因此景区只好做出限制每日人员流量的举措。
同理,在IT软件行业中,系统服务也是这样的。
如果你的系统理论是时间单位内可服务100W用户,但是今天却突然来了300W用户,由于用户流量的随机性,如果不加以限流,很有可能这300W用户一下子就压垮了系统,导致所有人都得不到服务。
因此为了保证系统至少还能为100W用户提供正常服务,我们需要对系统进行限流设计。
有的人可能会想,既然会有300W用户来访问,那为啥系统不干脆设计成能足以支撑这么大量用户的集群呢?
这是个好问题。如果系统是长期有300W的用户来访问,肯定是要做上述升级的,但是常常面临的情况是,系统的日常访问量就是100W,只不过偶尔有一些不可预知的特定原因导致的短时间的流量激增,这个时候,公司往往出于节约成本的考虑,不会为了一个不常见的尖峰来把我们的系统扩容到最大的尺寸。

二、服务限流应该怎么做?
对系统服务进行限流,一般有如下几个模式:

  1. 熔断: 
    这个模式是需要系统在设计之初,就要把熔断措施考虑进去。当系统出现问题时,如果短时间内无法修复,系统要自动做出判断,开启熔断开关,拒绝流量访问,避免大流量对后端的过载请求。系统也应该能够动态监测后端程序的修复情况,当程序已恢复稳定时,可以关闭熔断开关,恢复正常服务。
  2. 服务降级: 
    将系统的所有功能服务进行一个分级,当系统出现问题,需要紧急限流时,可将不是那么重要的功能进行降级处理,停止服务,这样可以释放出更多的资源供给核心功能的去用。 
    例如在电商平台中,如果突发流量激增,可临时将商品评论、积分等非核心功能进行降级,停止这些服务,释放出机器和CPU等资源来保障用户正常下单,而这些降级的功能服务可以等整个系统恢复正常后,再来启动,进行补单/补偿处理。 
    除了功能降级以外,还可以采用不直接操作数据库,而全部读缓存、写缓存的方式作为临时降级方案。
  3. 延迟处理: 
    这个模式需要在系统的前端设置一个流量缓冲池,将所有的请求全部缓冲进这个池子,不立即处理。然后后端真正的业务处理程序从这个池子中取出请求依次处理,常见的可以用队列模式来实现。这就相当于用异步的方式去减少了后端的处理压力,但是当流量较大时,后端的处理能力有限,缓冲池里的请求可能处理不及时,会有一定程度延迟。
  4. 特权处理: 
    这个模式需要将用户进行分类,通过预设的分类,让系统优先处理需要高保障的用户群体,其它用户群的请求就会延迟处理或者直接不处理。

那在实际项目中,对访问流量的限制,可采用如下几种技术方法:

  • 熔断技术
    熔断的技术可以重点参考Netflix的开源组件hystrix的做法,主要有三个模块:熔断请求判断算法、熔断恢复机制、熔断报警。

  • 计数器方法
    系统维护一个计数器,来一个请求就加1,请求处理完成就减1,当计数器大于指定的阈值,就拒绝新的请求。 
    基于这个简单的方法,可以再延伸出一些高级功能,比如阈值可以不是固定值,是动态调整的。另外,还可以有多组计数器分别管理不同的服务,以保证互不影响等。
  • 队列方法
    就是基于FIFO队列,所有请求都进入队列,后端程序从队列中取出待处理的请求依次处理。 
    基于队列的方法,也可以延伸出更多的玩法来,比如可以设置多个队列以配置不同的优先级。
  • 令牌桶方法
    首先还是要基于一个队列,请求放到队列里面。但除了队列以外,还要设置一个令牌桶,另外有一个脚本以持续恒定的速度往令牌桶里面放令牌,后端处理程序每处理一个请求就必须从桶里拿出一个令牌,如果令牌拿完了,那就不能处理请求了。我们可以控制脚本放令牌的速度来达到控制后端处理的速度,以实现动态流控。

三、服务限流的注意事项
我们在做服务限流的时候,还是有一些原则和事项需要注意的:

  • 实时监控:系统必须要做好全链路的实时监控,才能保证限流的及时检测和处理。
  • 手动开关:除系统自动限流以外,还需要有能手动控制的开关,以保证随时都可以人工介入。
  • 限流的性能:限流的功能理论上是会在一定程度影响到业务正常性能的,因此需要做到限流的性能优化和控制。

系统故障常常都是不可预测且难以避免的,因此作为系统设计师的我们,必须要提前预设各种措施,以应对随时可能的系统风险。

posted on 2019-03-29 12:58 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10620593.html

架构设计之「服务限流」相关推荐

  1. Spring Cloud Alibaba 系统保护:微服务架构雪崩效应与服务限流

    前面我们介绍了 OpenFeign 微服务间通信与 Spring Cloud Gateway 网关通信,这些是日常业务中的正常处理情况,但是在微服务环境下受制于网络.机器性能.算法.程序各方面影响,运 ...

  2. 架构设计之「 微服务入门 」

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 奎哥 来源 | 不止思考 微服务这几年不可谓不火,很多技术团队都开始在自己的项目上引入了微服务.一方面这些团队确实很好的推动了微服务 ...

  3. 儒猿秒杀季!微服务限流熔断技术源码剖析与架构设计

    疯狂秒杀季:49元秒杀 原价 299元 的 <微服务限流熔断技术源码剖析与架构设计课> 今天 上午11点,仅 52 套,先到先得! === 课程背景 === 成为一名架构师几乎是每个程序员 ...

  4. 分布式系统关注点(9)——想通关「限流」?只要这一篇

    如果这是第二次看到我的文章,欢迎右侧扫码订阅我哟~  ? 本文长度为2869字,建议阅读8分钟. 可能你在网上看过不少「限流」相关的文章,但是z哥的这篇可能是最全面,最深入浅出的一篇了(容我飘几秒-) ...

  5. 想通关「限流」?只要这一篇

    来源:跨界架构师 之前有了解到z哥的一部分读者们没有充分搞清楚「限流」和「熔断」的关系.我们先来思考一个问题,生活中也有限流,为什么国庆春节长假热门景点要限流?而不是一早先开几小时,如果人多了就关几小 ...

  6. 亿级流量架构之服务限流思路与方法

    为什么要限流 日常生活中,有哪些需要限流的地方? 像我旁边有一个国家AAAA景区,平时可能根本没什么人前往,但是一到五一或者春节就人满为患,这时候景区管理人员就会实行一系列的政策来限制进入人流量, 为 ...

  7. 微服务架构 — 服务治理 — 服务限流、服务降级、服务熔断

    目录 文章目录 目录 服务限流 服务降级 服务熔断 服务限流 C ⇄ S 的异常问题:C 的请求太多,超出 S 的服务能力,导致 S 不可用.例如:DoS 攻击,企图耗尽被攻击对象的资源,让目标系统无 ...

  8. 如何设计秒杀服务器的限流策略

    如果平时系统的访问量只有一万,而最大承受限制为五万,在秒杀时刻的瞬间,访问量突然增加到100W,此事系统一定会因访问量过大而宕机,此时就应该设计一个限流策略,使服务器能接收和处理的请求减少. 秒杀限流 ...

  9. 10分钟带你彻底搞懂服务限流和服务降级

    文章目录 十分钟搞懂系列 服务限流 计数器法 滑动窗口法 漏桶算法 令牌桶算法 服务降级 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.n ...

最新文章

  1. C#中实现对Excel特定文本的搜索
  2. python 调用linux命令-Python 调用系统命令
  3. 支付宝二面:Mybatis 接口 Mapper 内的方法为啥不能重载吗?我直接懵逼了。。。
  4. html 图片点击查看大图_【神游千年,大美敦煌】北魏-260窟【高清大图】
  5. mysql8.0.15远程登陆权限,MySQL8.0给root用户赋予远程连接权限
  6. 极域电子书包课堂管理系统_【君莲微讯】君莲学校(小学部)开展电子书包第13共同体数学研讨活动...
  7. jws 方式表格导出,excel文件导出,rest风格接口实现
  8. java管理员登录_idea实现管理员登录javaweb
  9. C++对象的赋值和复制
  10. react 属性与状态 学习笔记
  11. 【风格迁移】Neural Style Transfer 神经风格迁移
  12. 孙鑫VC学习笔记:第十九讲 动态链接库
  13. JAVA实现网页版斗地主_Java实现斗地主最简代码实例
  14. 时间转换 Wed Sep 16 2020 00:00:00 GMT+0800 (中国标准时间)
  15. 如何使用阿里云创建镜像和实例
  16. 神州战神系列装系统过程,其他电脑大同小异
  17. 友盟APM和bugly全面对比
  18. 网易云---手机验证码登录
  19. 微信小程序发展(未完待续)
  20. word输入卡顿延迟的解决办法

热门文章

  1. php取得文件的大小
  2. Python 技术篇-用paramiko库实现winodws本地文件上传至linux服务器实例演示
  3. PyQt5 技术篇-QWidget、QDialog程序窗口关闭closeEvent()触发事件方法重写
  4. JS获取当天零点或23:59:59的时间
  5. 【upc 9541 矩阵乘法】非正解
  6. 3.6 matlab函数文件的定义与调用
  7. Given an integer, write a function to determine if it is a power of two
  8. [解答] python下如何安装SocketServer?
  9. 物体掉落速度_重3吨的巨型“手环”掉落高速路,车辆纷纷刹车躲避
  10. HZOJ 赤(CF739E Gosha is hunting)