test: verify event consumer slow-handler backpressure
This commit is contained in:
39
docs/reports/phase-6-slow-consumer.md
Normal file
39
docs/reports/phase-6-slow-consumer.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# P6 真实慢消费者背压回归
|
||||
|
||||
日期:2026-09-20。本批在一次性 MySQL 和真实 Orbit HTTP/WebSocket 服务上验证 SDK 消费器容量为 1 时的慢处理器背压。它补充 SDK 连接层重连边界,不代表跨节点重连、全局积压容量、磁盘/锁等待或生产 RPO/RTO 验收。
|
||||
|
||||
## 场景和结果
|
||||
|
||||
`TestIntegrationEventConsumerSlowHandlerBackpressure` 先投递一条取消结果,启动正式 `EventConsumer`,让第一个处理器停在业务处理阶段;处理器容量固定为 1。随后再产生第二条结果,测试通过真实订阅读取确认两条交付均已持久化,但在释放第一个处理器之前没有启动第二次处理,也没有提交 ACK。释放后两条交付都完成并各自只尝试一次。
|
||||
|
||||
| 证据 | 结果 |
|
||||
| --- | ---: |
|
||||
| 消费器本地容量 | 1 |
|
||||
| 持久化交付 | 2 |
|
||||
| 处理器调用(释放前) | 1 |
|
||||
| ACK(释放前) | 0 |
|
||||
| 处理器调用(最终) | 2 |
|
||||
| ACK(最终) | 2 |
|
||||
| 每条交付 attempts | 1、1 |
|
||||
| 重复处理 | 0 |
|
||||
|
||||
同批定向真实服务回归还运行了 ACK 提交回执丢失和自然租约补发:三项合计 52.645 秒,均通过;慢消费者用例本身 3.15 秒。环境为 Docker Go 1.25.14 Linux arm64、一次性 MySQL 8.4.10,服务端和 SDK 使用临时 modfile,仓库声明的 Go 1.27.1 未修改。`go test -race` 通过,数据库外键为 0。
|
||||
|
||||
## 结论边界
|
||||
|
||||
该用例证明容量窗口会把慢处理器期间的后续结果留在服务端,释放后按原交付身份继续消费,不会在 SDK 内存中并行启动超出容量的处理器。业务处理器仍必须响应 context 取消,并在业务 Inbox 去重与业务效果同一事务提交后才返回成功。
|
||||
|
||||
当前仍未验证多个节点同时连接、跨节点慢消费者公平性、连接风暴叠加积压、租约到期期间的业务 Inbox 去重、数据库锁/连接池/磁盘曲线和生产容量。上述项目必须在目标拓扑中另行执行,不能由本次单节点样本推导。
|
||||
|
||||
## 复现
|
||||
|
||||
在一次性 MySQL、迁移完成、带 `worker-access` 与 `event-access` 的凭据以及真实 Orbit 服务后,执行:
|
||||
|
||||
```sh
|
||||
cd sdk/go
|
||||
ORBIT_TEST_WORKER_URL=http://127.0.0.1:$PORT \
|
||||
ORBIT_TEST_WORKER_CREDENTIALS_FILE=/tmp/orbit-event-test/credentials.json \
|
||||
go test -race -count=1 -run '^TestIntegrationEventConsumer(HeartbeatAndLostAck|FailureRedeliversNaturally|SlowHandlerBackpressure)$' -v .
|
||||
```
|
||||
|
||||
缺少隔离服务或凭据时测试会跳过,跳过不能记作通过。标准 `make integration` 会在下一次完整回归中自动包含该用例。
|
||||
@@ -23,12 +23,13 @@
|
||||
| 真实定时集中触发测量 | `orbit-schedule-load`;4×6及32×4触发,2×12截止负例,见[定时测量报告](phase-6-schedule-load.md) | 正常152项逐项核验;负例18个未观察点、4个未核验任务,非零退出;38个计划均暂停,实际库外键0。SDK全模块竞态/vet/build通过;生产容量未验收 |
|
||||
| 长期积压与曲线 | `make schedule-backlog`;32×8共256个触发点,1 Worker/容量1,独立连接每2秒读取状态 | 最高等待249,180秒截止时173成功/83未核验,计划全部暂停,实际库外键0;目标硬件资源与生产容量未验收,见[积压报告](phase-6-backlog.md) |
|
||||
| SDK 重连边界 | `TestEventConsumerReconnectStormUsesBoundedBackoff`,真实 TLS 测试服务器,4次连续断线 | 第5次连接恢复,重连4次、处理器调用1次、ACK1次;真实慢消费者/跨节点重连仍未验收,见[重连报告](phase-6-reconnect-storm.md) |
|
||||
| 真实慢消费者背压 | MySQL 8.4.10 一次性库、真实 Orbit HTTP/WebSocket、`TestIntegrationEventConsumerSlowHandlerBackpressure` | 容量1阻塞首个处理器时第二条交付保留在服务端;释放后2次处理/2次ACK、每条attempts=1;跨节点公平、资源曲线和生产容量仍未验收,见[慢消费者报告](phase-6-slow-consumer.md) |
|
||||
|
||||
## 当前环境仍未覆盖
|
||||
|
||||
此前使用容器网络别名运行存储集成时,两组 COMMIT 故障测试曾因自身 `127.0.0.1` 明文连接前置条件被拒绝;本轮已改用共享网络命名空间单独复跑并通过,因此不再把它们列为未验证场景。共享网络命名空间只解决测试进程的 loopback 观察条件,不改变生产部署约束。
|
||||
|
||||
当前仍未完成仓库声明 Go 1.27.1 下的无过滤标准全量回归,以及 SDK/服务端跨标签矩阵;新增长期积压样本见[报告](phase-6-backlog.md),仍未升级为生产容量结论。上述 Docker Go 1.25 共享网络结果补齐了当前容器环境的进程故障证据,但不替代目标发布环境的工具链、拓扑和版本兼容门禁。
|
||||
当前仍未完成仓库声明 Go 1.27.1 下的无过滤标准全量回归,以及 SDK/服务端跨标签矩阵;新增长期积压和慢消费者样本见[报告](phase-6-backlog.md)与[慢消费者报告](phase-6-slow-consumer.md),仍未升级为生产容量结论。上述 Docker Go 1.25 共享网络结果补齐了当前容器环境的进程故障证据,但不替代目标发布环境的工具链、拓扑和版本兼容门禁。
|
||||
|
||||
历史 macOS arm64 + Go 1.27.1 + loopback MySQL 的完整切点记录见[故障边界报告](phase-6-fault-boundaries.md)。当前 Docker Go 1.25 结果仍不升级为仓库声明 Go 1.27.1 的正式全量结论。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user