当前位置: 首页 > 科技观察

限流保证系统高可用

时间:2023-03-19 16:31:29 科技观察

我们经常看到各大云服务厂商声称自己的服务是五个九。这里的五个九是指系统服务时间占整体时间的99.999%,按一年计算的话,系统宕机时间必须小于5分16秒。对于一些核心系统,一旦系统服务宕机,会影响很多下游的服务和客户,所以一个可靠的系统必须具备高可用性。今天主要说说系统开发相关的一些东西——限流。1.简介首先用级联故障(Cascadingfailure)这个比较流行的微服务的概念来说明限流的重要性。在计算机系统中,级联故障可以描述为一个服务节点发生故障,导致请求重新分配给其他服务节点,导致其他服务节点过载而相继发生故障的问题。下图是wiki上的一张图,说明了级联故障。1.1避免资源耗尽如果我们把系统服务看成是某种资源,比如掘金首页的信息流文章,由于服务器资源有限,很多时候我们限流的主要目的是为了能够保证业务资源不被耗尽,避免上述连锁故障。1.2服务资源管理有时,由于服务产品等级不同,可能需要区分用户等级,进而控制各等级用户使用的资源等级,这也是限流发挥作用的地方。一个典型的例子是Saas多租户。对于普通客户,可以只使用共享服务资源,对于付费客户,服务资源可以单独分配。两者都需要使用限流来进行资源分配。1.3避免间接成本随着Serverless技术的成熟,越来越多的产品迁移到Serverless架构。这有很多优点。动态扩展可以合理利用服务器资源,避免过度浪费。但是,在不同的场景下,可能会出现突发的交通问题。比如某个点的流量翻了一番,但是持续的时间很短。可能是更好的方法。2、限流方式相应的,限流方式也多种多样,不同场景的要求也不同。了解这些方法可以方便后续的系统设计和决策。2.1非限流措施通常,对于系统设计,我们需要一个自下而上的解决方案,即即使限流方法失效,系统仍然可以反馈正常的错误系统和提示。当普通系统过载时,系统服务可以设置固定的超时时间和服务熔断,保证服务调用者获取到服务异常的原因(理论上熔断是一种限流)。2.2服务降级对于一些重要的服务,在面临大量负载的时候,往往需要降级一些请求,因为在某些情况下,数据库或者计算资源是有限的,单个请求的计算开销比较大。这时候可以通过降级服务来降低系统的整体负载。例如,如果服务返回的信息包含大量内容,则只能返回关键信息,无法获取其他信息。使用缓存的结果而不是真实的结果可能会导致数据不一致,但满足了服务的高可用性,在短期情况下是可以接受的。甚至直接返回固定结果,这种策略往往简单粗暴,可以大大降低系统的复杂度。2.3延迟处理在一些内部系统中,当某些请求的实时性不高,或者系统不需要返回结果时,当系统面临高负载时,可以进行延迟处理,这样也降低了系统变相在一定时间内处理。的频率。简单的方法是延迟一段时间处理;更多的时候,需要使用消息系统来dump任务,方便任务处理失败或者超时的重试。2.4服务限流对于大多数场景,我们可能需要对服务请求负载进行限制,以保证系统负载稳定正常。常见的限流方式有:计数器方式,主要思想是通过维持计数来保证系统运行时不会出现过多的服务请求。漏桶算法。与计数器方法相比,漏桶算法以恒定速度增加处理流量,以保证系统的处理速度即使在过载的情况下仍然可以以恒定速度进行。令牌桶算法,令牌桶算法,将服务请求抽象成资源,通过系统生成令牌,保证系统在某一时刻处理固定数量的令牌请求,达到保护系统的目的。固定时间窗方法,该方法通过指定系统在固定时间窗内可以处理的固定请求数来达到保护系统的目的。滑动窗口法,这种方法可以解决固定时间窗口的缺陷。在固定时间窗口内,存在突发流量无法顺利处理的问题。几秒钟之内,系统收到2000个请求,后续的1000个请求需要等到下一个时间窗口。滑动窗口将窗口划分为若干个小区间,保证每个小区间都能处理合适的请求,这样可以让系统在面对突如其来的流量时负载更加顺畅。动态限流,这种限流的主要优点是可以根据系统运行时的状态动态调整限流规则。有的类似于TCP拥塞算法,通过算法进程进行限流控制;一些参考历史负载情况以智能地适应短期负载。上述具体算法的详细解释和实现过程,请参考下篇文章《保障系统高可用性 之 限流(二)》问题常说“不要过早优化”,但在系统设计中需要考虑限流等手段。如何平衡两者的关系?不同的限流算法对系统负载有何影响?如何根据系统场景选择合适的限流算法?作者:志诚路链接:https://juejin.im/post/5eb959c9e51d451b2e0332ea