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.
1.8 KiB
1.8 KiB
04 — 同步兜底(PENDING → 同步生成)
What to build: 缩略图首次请求时的同步兜底生成机制。当 getThumbnail 遇到 thumbnail_status = PENDING(异步任务尚未完成)时,尝试获取 Redis 分布式锁(SET crm:file:thumbnail:lock:{fileId} 1 NX EX 30)。获锁成功 → 同步调 ThumbnailGenerationTask 的生成逻辑 → 完成后返回真缩略图 + max-age=86400;获锁失败(异步任务正在跑)→ 每 500ms 轮询 thumbnail_status,超过 sync-wait-timeout(默认 10s)仍为 PENDING → 返回占位图 + no-cache + HTTP 202。锁 TTL 30 秒覆盖最慢的渲染场景。完成后即使异步任务没跑完,首次请求也能拿到真缩略图。
Blocked by: 03 — 图片异步生成
Status: ready-for-agent
FileApiImpl.getThumbnail()的 PENDING 分支实现:尝试 RedisSET ... NX EX 30获锁- 获锁成功 → 同步触发生成逻辑(复用 ThumbnailGenerationTask 的核心方法,不是 @Async 调用)→ 完成后返回真缩略图 + max-age=86400
- 获锁失败 → 每 500ms 轮询 thumbnail_status,超 sync-wait-timeout(默认 10s)→ 返回占位图 + no-cache + HTTP 202
- 获锁失败 + 等待期间异步任务完成(状态变 READY)→ 返回真缩略图 + max-age=86400
- 生成逻辑抽取为可复用方法(异步任务和同步兜底共用,避免两套代码)
- 测试:PENDING + 获锁成功 → 同步生成 → 返回真缩略图 + max-age=86400
- 测试:PENDING + 获锁失败 → 轮询超时 → 返回占位图 + no-cache + 202
- 测试:PENDING + 获锁失败 + 等待期间变 READY → 返回真缩略图
- 测试:并发两路(异步 + 同步兜底)→ 分布式锁保证只生成一次