系统设计 | 异步 - 背压机制(back pressure)

背景

今天看下Applying Back Pressure When Overloaded主要讲的是系统持续过载时的一种处理手段,核心观点限制队列长度(limit the queue size),从而为队列中的任务维持系统高吞吐率和良好的响应时间

  • Back Pressure,中文叫做背压,大概就是管道满了后给发送者一个反向压力的意思吧。

无边界队列的问题

系统容量是线程池大小和处理单个事务(transaction)速度的相关函数;线程池一般也是使用一个队列实现的,如果new ThreadPoolExecuter()时使用无边界队列的话,相当于对队列没有任何限制;系统过载时,队列无限增长可能超过内存大小,会出现缓存不命中,磁盘读等问题,最终导致系统响应时间变长甚至系统崩溃;

linux有一个overcommit机制,就是会对内存超售。malloc申请内存后,即使没有内存,也会返回成功;其他操作系统没这个机制;这样会导致系统过载后,不会立马crash,过一会会引发OOM killer,就会很糟糕。

系统分析

如下系统遵循SOC设计,网关服务和业务服务分开设计,网关服务负责协议转换和边界安全问题;对外提供的系统响应SLA,需要考虑三个因素:

  • 单个事务的处理时间
  • 线程数量
  • 任务队列长度

公式如下:

 max latency = (transaction time / number of threads) * queue length
 queue length = max latency / (transaction time / number of threads)

⚠️ 活跃的线程数量会发生变化的,某些线程可能一直被慢事务占用;transaction time也会发生变化的。

系统请求流的简图

如果网络协议是TCP,通过填充网络缓冲区对发送方施加反压力(back pressure)。这个过程可以通过网关一直重复到客户。对于每个服务,我们都需要配置队列,以便它们在实现端到端客户体验所需的服务质量方面发挥自己的作用。一旦队列填满,客户端将得到服务器忙或者 HTTP 503 状态码,以便稍后重试。客户端可以在稍后时间重试该请求;这是限流领域的问题了;

应该监控队列和线程数量,例如队列70%满了,可以触发报警。队列长度的设定也是一门学问。

参考

Applying Back Pressure When Overloaded

猜你喜欢

转载自blog.csdn.net/mike_learns_to_rock/article/details/88592461
今日推荐