Appearance
资源锁定
WebSocket 连接使用分布式资源锁保证数据一致性。
锁定规则
| 资源类型 | 锁范围 | 说明 |
|---|---|---|
| 对话 | 单对话 | 同一对话只允许一个 WebSocket 连接 |
| 项目 | 单项目 | 同一项目只允许一个 WebSocket 连接 |
| 画布 | 单画布 | 同一画布只允许一个 WebSocket 连接 |
锁的生命周期
- 获取锁:WebSocket 连接建立时自动获取
- 持有锁:整个 WebSocket 会话期间持有
- 释放锁:连接断开时自动释放
- 锁超时:连接异常断开时,锁在超时后自动释放
冲突处理
当资源已被锁定时:
- 新的 WebSocket 连接尝试会收到 Close Code
4009 - 客户端应提示用户"该资源正在被使用"
- 等待前一个连接释放后再重试
补全锁
对话补全(AI 生成回复)有额外的补全锁:
- 同一对话同一时间只能有一次补全
- 第二次
request_completion不会被立即拒绝,而是排队 - 队列满时(上限 50 条消息),新消息返回错误
锁丢失
极少数情况下,持有锁的连接可能因网络原因丢失锁:
- 服务端检测到锁丢失后会主动关闭 WebSocket(Close Code
4009) - 客户端应自动重连
测试要点
测试建议
- 锁互斥:同一资源开两个 WS 连接,第二个应被拒绝
- 锁释放:关闭 WS 后应能立即建立新连接
- 异常断开:模拟网络中断后锁应在超时后自动释放
- 补全排队:补全进行中发送新消息应排队而非报错
- 队列满:大量快速发送消息直到队列满,应收到错误
- 不同资源:锁定对话 A 不影响对话 B 的连接