用乐观锁而不是悲观锁控制版本冲突
依据智能体任务多为「读—算—写」,持锁期间在算会产生长事务;乐观锁把冲突推到提交时检查,读路径完全无锁。
代价高冲突场景下会频繁失败重试,需要调用方处理重试语义。
PRODUCT → EVIDENCE
问题:多个智能体同时修改任务,可能发生覆盖或依赖倒挂。我的判断:用版本校验、能力匹配与依赖排序约束协作。
结果:09-06 本地报告记录 100/100 请求成功、API P95 最高 44.40 ms;当前源码有批量写入和请求关联。不足:旧压测不代表新版本容量,长尾抖动仍待定位。
已核对批量写入 API、X-Request-ID → 领域事件 trace_id、观测测试和 docs/rollout.md。发布设计已完成;应用内关联不等于跨服务 span 链,实际灰度、回滚演练和新版容量仍待验证。
下一步:在目标机器批准观察窗口与基线,演练正确性故障、长尾延迟和回滚;对批量写入作同环境比较,避免预设 20 entries/s 为硬上限。
材料区分报告记录、源码核对与待办设计;不代表真实用户效果或本轮重新运行了底层项目。
② 角色与时间
③ 问题背景
多个智能体共享一块状态时,最容易出的不是「算不出来」,而是算对了但写坏了:两个智能体同时改同一个任务、依赖还没完成就被分配、冲突静默覆盖。黑板模式的好处是状态集中可审计,坏处是所有并发压力都集中在一点。
这一版要回答的是:在 SQLite 这种单写锁的存储上,这套协作机制能撑到什么程度,先坏在哪里。
④ 关键判断与实现代价
依据智能体任务多为「读—算—写」,持锁期间在算会产生长事务;乐观锁把冲突推到提交时检查,读路径完全无锁。
代价高冲突场景下会频繁失败重试,需要调用方处理重试语义。
依据抢单会让「有能力但慢」的智能体拿不到任务,最终质量取决于谁反应快,而不是谁更合适。
代价需要维护能力标签,且分配逻辑比抢单慢一步。
依据依赖倒挂会产出看起来完成、实际不可用的结果,比直接失败更难排查。
代价有环的依赖会被直接拒绝,灵活性下降。
依据不压测就不知道瓶颈在哪,也不知道该优化什么。功能测试全绿的系统在高并发下可能第一个请求就坏。
代价多花了一份压测脚本的成本,但换来了明确的瓶颈结论。
⑤ 实现要点
八个服务模块围绕黑板展开:智能体注册与心跳(无心跳即视为下线,任务可被重新分配)、乐观锁版本控制(写入时校验版本号)、基于能力的任务分配、依赖拓扑排序、冲突解决。
状态存在 SQLite 单库,WebSocket 负责把黑板变更推给订阅方,避免轮询。
⑥ 可验证结果
证据:trae_projects/agent-tree/reports/performance_test_report.md(4,075 B)
⑦ 已落实的改进与下一步
当前源码已提供批量条目接口、请求关联 ID、领域事件 trace_id 及发布/回滚设计稿。它们补齐了实现与运维入口;本轮未重跑性能或回滚演练,不能据此声称写入吞吐提升。
下一步在同一机器、相同数据与负载下,对照单条提交和批量提交,记录错误率、吞吐与长尾延迟;继续定位历史 821.88 ms 推送抖动,再审批发布阈值。