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.9 KiB

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

  • FileApiImpl.getThumbnail() 的 PENDING 分支实现:尝试 Redis SET ... NX EX {lock-ttl}(默认 150s)获锁
  • 获锁成功 → 同步触发生成逻辑(复用 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 → 返回真缩略图
  • 测试:并发两路(异步 + 同步兜底)→ 分布式锁保证只生成一次