Add Redis-backed chat queue

This commit is contained in:
2026-07-08 17:36:20 +08:00
parent db1d83631b
commit 23d5f42972
11 changed files with 349 additions and 7 deletions

View File

@@ -381,3 +381,38 @@
1. 不改变知识库召回排序和 Prompt 构建。
2. 不缓存用户问题、模型回答和用户隐私信息。
3. 不把飞书读取失败结果长时间缓存,避免权限/配置修复后仍命中错误缓存。
## 阶段 4A 实施记录
2026-07-08 完成 Redis 全局问答队列第一版。
已完成:
1. 后端增加 Redis 依赖和 `REDIS_URL` 配置。
2. dev compose 增加 `redis` 服务,后端默认连接 `redis://redis:6379/0`
3. 新增 `RedisChatQueueManager`
- 使用 Redis sorted set 保存 active 请求 token 和过期时间。
- 使用 Redis list 保存等待队列 token。
- 使用 Lua 脚本保证申请名额、入队、队首晋升等操作的原子性。
4. 新增 `chat_queue_runtime`
- Redis 可用时优先使用 Redis 全局队列。
- Redis 不可用或运行时异常时,自动回退到原进程内队列。
5. active token 增加租约过期时间,默认 `chat_active_lease_seconds=900`,避免 worker 异常退出后永久占用并发名额。
6. 管理后台系统设置新增“问答执行租约(秒)”配置。
7. 用户端 SSE 协议未变化。
验证记录:
1. 本机 `compileall` 检查通过。
2. `git diff --check` 通过。
3. Docker dev 环境已新增并启动 RedisRedis 健康检查通过。
4. 容器内 Redis 队列行为验证通过:第一个请求获得执行名额,第二个请求进入排队,第三个请求被拒绝,释放名额后第二个请求恢复执行。
5. 后端健康检查通过。
6. 真实 `/chat/completions` 验证通过:首个事件为 `generating`,随后返回 `content`,最后返回 `[DONE]`
7. 真实会话历史验证通过:流式完成后用户消息和助手消息均已落库。
阶段限制:
1. 当前 Redis 队列使用轮询晋升等待请求,下一步可以结合 Pub/Sub 或 blocking pop 降低等待侧轮询。
2. Redis 飞书共享缓存还未接入,将在阶段 4B 完成。
3. 生产部署需要确认 Redis 持久化、内存上限、淘汰策略和监控告警。