高并发之API接口限流.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高并发之API接口限流 2021-08-15 在开发高并发系统时有三把利器用来爱护系统:缓存、降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务消灭问题或者影响到核心流程时,需要临时屏蔽掉,待高峰或者问题处理后再打开 限流 限流的目的是通过对并发访问/恳求进行限速,或者对一个时间窗口内的恳求进行限速来爱护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理 问题描述 ?   某天A君突然发觉本人的接口恳求量突然涨到之前的10倍,没多久该接口几乎不行使用,并引发连锁反应导致整个系统崩溃。如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦有人使用超大功率的设备,保险丝就会烧断以爱护各个电器不被强电流给烧坏。同理我们的接口也需要安装上“保险丝”,以防止非预期的恳求对系统压力过大而引起的系统瘫痪,当流量过大时,可以实行拒绝或者引流等机制。? ? ? ? ? ?缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的功能则需要临时屏蔽掉,待高峰或者问题处理后再打开;而有些场景并不能用缓存和降级来处理,比如稀缺资源(秒宰、抢购)、写服务(如评论、下单)、频繁的简单查询(评论的最终几页),因而需有一种手段来限制这些场景的并发/恳求量,即限流。 ? ? ? ? 系统在设计之初就会有一个预估容量,长时间超过系统能承受的TPS/QPS阈值,系统可能会被压垮,最终导致整个服务不够用。为了避开这种情况,我们就需要对接口恳求进行限流。? ? ? ? ?限流的目的是通过对并发访问恳求进行限速或者一个时间窗口内的的恳求数量进行限速来爱护系统,一旦达到限制速率则可以拒绝服务、排队或等待。? ? ? ? ? 一般开发高并发系统常见的限流模式有把握并发和把握速率,一个是限制并发的总数量(比如数据库连接池、线程池),一个是限制并发访问的速率(如nginx的limit_conn模块,用来限制瞬时并发连接数),另外还可以限制单位时间窗口内的恳求数量(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率)。其他还有如限制近程接口调用速率、限制MQ的消费速率。另外还可以依据网络连接数、网络流量、CPU或内存负载等来限流。 相关概念:? PV: page view 页面总访问量,每刷新一次记录一次。 UV: unique view 客户端主机访问,指一天内相同IP的访问记为1次。 QPS: query per second,即每秒访问量。qps很大程度上代表了系统的繁忙度,没次恳求可能存在多次的磁盘io,网络恳求,多个cpu时间片,一旦qps超过了事后设置的阀值,可以考量扩容添加服务器,避开访问量过大导致的宕机。 RT: response time,每次恳求的响应时间,直接打算用户体验性。 ? 本文次要引见应用级限流方法,分布式限流、流量入口限流(接入层如NGINX limit_conn和limit_req 模块)。 应用级限流 一、把握并发数量 属于一种较常见的限流手段,在实际应用中可以通过信号量机制(如Java中的Semaphore)来实现。操作系统的信号量是个很重要的概念,Java 并发库 的Semaphore 可以很轻松完成信号量把握,Semaphore可以把握某个资源可被同时访问的个数,通过 acquire() 猎取一个许可,假如没有就等待,而 release() 释放一个许可。 举个例子,我们对外供应一个服务接口,允许最大并发数为10,代码实现如下: public class DubboService { private final Semaphore permit = new Semaphore(10, true); public void process(){ try{ permit.acquire(); //业务规律处理 } catch (InterruptedException e) { e.printStackTrace(); } finally { permit.release(); } } } ? ? ? 在以上代码中,虽然有30个线程在执行,但是只允许10个并发的执行。Semaphore的构造方法Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量。Semaphore(10)表示允许10个线程猎取许可证,也就是最大并发数是10。Semapho

文档评论(0)

136****7795 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档