背压、取消与服务测试
流式生产者比客户端消费者快时,必须使用有界队列或明确丢弃策略;无限缓冲会把内存和租户成本一起耗尽。客户端断开不等于服务端副作用已取消,取消请求需要传播到模型、工具和队列,并在提交前再次检查。测试应覆盖慢消费者、断线重连、重复事件、超时和取消竞态。
第一个可运行实验:有界队列拒绝过载
保存为 backpressure.py,用 Python 3.12 运行。
python
from collections import deque
class Buffer:
def __init__(self, limit):
self.limit, self.items = limit, deque()
def put(self, item):
if len(self.items) >= self.limit:
return False
self.items.append(item)
return True
def get(self):
return self.items.popleft() if self.items else None
b = Buffer(2)
assert b.put('a') and b.put('b')
assert not b.put('c')
assert b.get() == 'a'
assert b.put('c')
print('bounded backpressure passed')背压策略可以阻塞生产者、暂停上游读取、丢弃可重建的增量或转存持久队列;工具结果和完成事件不能随意丢弃。重连使用最后确认序号和结果版本,客户端去重;完成后订阅应直接读取持久结果。
变体实验
把 put 改为丢弃最旧文本,说明为什么不适用于工具结果。再模拟取消标记在队列等待期间到达,要求 worker 在副作用前检查。
练习
- 为事件定义序号、确认序号和结果版本。
- 设计客户端断线后的恢复订阅协议。
- 列出同步请求、流式请求和长任务各自的超时层级。