← 中文资源

简体中文版本

合并同一 key 的并发请求

把同一 key 的同时缓存未命中合并为一次源站调用,共享结果,并清理进行中条目以便重试。

阅读英文原文

一个 key,一次源站调用

热 key 未命中时,并发请求都看到同一次未命中。请求合并保存进行中的 Promise,并返回给每个调用方。第一个请求执行加载,其余等待同一结果。

const existing = inFlight.get(key);
if (existing) return existing;
const promise = load().finally(() => inFlight.delete(key));
inFlight.set(key, promise);

失败时移除条目

在 finally 中删除至关重要。如果拒绝的 Promise 留在 map 中,后续每个请求都会收到同一失败而不重试。移除条目,让下一个请求重新加载,并受超时和重试策略约束。

限制等待

慢加载器会拖住该 key 的所有调用方。使用与底层依赖相同的超时,并考虑短期 stale-while-revalidate 缓存,让调用方拿到旧值而不是等待。监控合并等待时间、源站调用次数和错误率。部署合并后源站调用突然上升,通常说明 key 包含请求特定值而永不匹配。

验证合并

预期结果:同一 key 的 20 个并发请求只产生一次源站调用,所有请求得到相同结果;加载失败后下一次请求会重新尝试。用计数加载器和并发测试确认,并检查失败条目已从 map 删除。