Adaptive Concurrency Limits @ Netflix

查看原文

本文是 Netflix 工程师团队产出的关于如何配置服务负载的博客,他们的产出是一个 Java 库 concurrent-limits。保障服务稳定的手段有:断路器,并发控制,Chaos 测试等等,本文关注自适应的并发控制(adaptive concurrency limits)。查看代码库

  • 理论储备:并发是在某个时间点系统能同时处理请求的能力,根据 Little's Law, 平均服务时间乘以平均服务调用率可以得到并发量。如果超量,要么进入队列等待,要么被拒绝访问。一个系统如果不设限制,这个队列将会不断增长直到所有请求都开始超时直到系统内存溢出到崩溃。这个系统的超时甚至可能引发整个系统的层叠崩溃(雪崩)。问题的核心在于这个限制该设置多少。
  • Netflix 的做法是自动调整,limit = 在性能开始降级时的系统承受的并发量(inflight request,即 concurrency + queue)。如果手动调,一段时间内可能比较合理,但现实容易变。他们的预设目标是:无需人工干预,不需要询问别的服务,不需要对系统其它组件有了解,能根据系统流量适配变更,容易计算但也容易人工干预。
  • 这套算法的核心窃取自 TCP 拥塞控制算法(TCP congestion control algorithm)。最开始这个 limit 比较小,然后随着流量变多这个拥塞窗口开始变大。如果系统性能下降,这个 limit 也会相对变小。一旦并发超限,超限部分将会被拒绝服务。这样就保证了系统拥有较低的 latency,整个系统也能正常运转。这套算法应用的对象是具体的服务。