feat: 实现写入队列合并事务与 SAVEPOINT 隔离

This commit is contained in:
Nixevol
2026-09-30 06:48:27 +08:00
parent d777a1e3d3
commit f2fe4bdbbe
3 changed files with 392 additions and 34 deletions
+16
View File
@@ -182,6 +182,22 @@
- 备选方案:先关 listener、Drain、再 Shutdown。
- 影响:有 MQTT 长连接后需 N/P 联调停机路径。
### P2 2026-09-30
1. **合并写入队列替换 T0.3 简单实现**
- 原条款:DEVELOPMENT 7.2;TASKS P2。
- 实际做法:单写 goroutine;批次上限 256 或等待 2ms;每操作用 `SAVEPOINT`/`ROLLBACK TO`/`RELEASE`;Begin/Commit/SAVEPOINT 基础设施失败返回 `errors.Join(ErrBusy, err)` 并令 `IsReady()=false`;业务操作错误只回滚该 SAVEPOINT,不标 busy。
- 原因:满足每秒约 200 条写入的落盘合并需求。
- 备选方案:按固定时间窗无条件合并。
- 影响:调用方需用 `errors.Is(err, store.ErrBusy)` 映射协议 `busy`;`/readyz` 读 `DB.Ready`。
2. **调用方 context 取消与已入队任务**
- 原条款:未规定入队后取消。
- 实际做法:入队前检查 ctx;批次执行前再检查;若调用方在等待结果时取消,最多再等 30 秒取结果以免泄漏。
- 原因:写 goroutine 仍可能已执行该操作,不能静默丢结果。
- 备选方案:取消即从队列摘除(需可取消数据结构)。
- 影响:极端取消场景下调用方可能多等一会儿。
## 连接 N
暂无。