You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
# 04 — 同步兜底(PENDING → 同步生成)
|
|
|
|
|
|
|
|
|
|
**What to build:** 缩略图首次请求时的同步兜底生成机制。当 `getThumbnail` 遇到 `thumbnail_status = PENDING`(异步任务尚未完成)时,尝试获取 Redis 分布式锁(`SET crm:file:thumbnail:lock:{fileId} 1 NX EX {lock-ttl}`)。获锁成功 → 同步调 `ThumbnailGenerationTask` 的生成逻辑 → 完成后返回真缩略图 + `max-age=86400`;获锁失败(异步任务正在跑)→ 每 500ms 轮询 `thumbnail_status`,超过 `sync-wait-timeout`(默认 10s)仍为 PENDING → 返回占位图 + `no-cache` + HTTP 202。锁 TTL 可配置(`lock-ttl`,默认 150s),必须大于 `office-convert-timeout`(默认 120s)以覆盖最慢的渲染场景(见 spec §7.4 / ADR-0013)。完成后即使异步任务没跑完,首次请求也能拿到真缩略图。
|
|
|
|
|
|
|
|
|
|
**Blocked by:** 03 — 图片异步生成
|
|
|
|
|
|
|
|
|
|
**Status:** ready-for-agent
|
|
|
|
|
|
|
|
|
|
- [x] `FileApiImpl.getThumbnail()` 的 PENDING 分支实现:尝试 Redis `SET ... NX EX {lock-ttl}`(默认 150s)获锁
|
|
|
|
|
- [x] 获锁成功 → 同步触发生成逻辑(复用 ThumbnailGenerationTask 的核心方法,不是 @Async 调用)→ 完成后返回真缩略图 + max-age=86400
|
|
|
|
|
- [x] 获锁失败 → 每 500ms 轮询 thumbnail_status,超 sync-wait-timeout(默认 10s)→ 返回占位图 + no-cache + HTTP 202
|
|
|
|
|
- [x] 获锁失败 + 等待期间异步任务完成(状态变 READY)→ 返回真缩略图 + max-age=86400
|
|
|
|
|
- [x] 生成逻辑抽取为可复用方法(异步任务和同步兜底共用,避免两套代码)
|
|
|
|
|
- [x] 测试:PENDING + 获锁成功 → 同步生成 → 返回真缩略图 + max-age=86400
|
|
|
|
|
- [x] 测试:PENDING + 获锁失败 → 轮询超时 → 返回占位图 + no-cache + 202
|
|
|
|
|
- [x] 测试:PENDING + 获锁失败 + 等待期间变 READY → 返回真缩略图
|
|
|
|
|
- [x] 测试:并发两路(异步 + 同步兜底)→ 分布式锁保证只生成一次
|