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

本文介绍了背压(back pressure)机制,一种在系统过载时保持高吞吐量和响应时间的方法。无边界队列可能导致内存溢出和系统崩溃,而背压通过限制队列长度来避免这些问题。系统设计中,背压的应用需要考虑事务处理时间、线程数量和队列长度。当队列达到一定阈值时,系统返回HTTP 503,提示客户端重试,以防止过载。监控队列和线程状态对于及时发现和缓解背压至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

今天看下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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值