我有一个 Web 服务器需要从一个缓慢的 api 中获取和缓存大约 1000 个项目。
我希望第一个请求和任何遇到 ttl 过期的请求都能启动此操作,但随后会继续请求。它有其他要返回的值,并且可以为即将刷新的数据提供陈旧或空值。
我重新创建了一个简化的例子:
// ... within some handleRequest function
if (
!cache.isFetching &&
(!cache.isSet || cache.isStale)
) {
// start fetch/cache, but don't block
fetchAndCacheThatStuff();
}
// ... continue with request handling
我正在尝试推理在缓存刷新期间请求进入时如何/何时阻塞:
async function fetchAndCacheThatStuff() {
cache.isFetching = true;
for (const twoHundoIds of chunk(oneThousandIds, 200) {
const result = await fetchItems(twoHundoIds);
await cache.mset(result.map(mapResultToCacheEntries));
}
cache.isSet = true;
cache.isStale = false;
}
是否存在服务器等待响应而无法处理另一个传入请求的时间?
异步函数
fetchAndCacheStuff
在等待响应时不会阻塞
来自 Node.js 设计模式 第 5 章:具有 Promises 和 Async/Await 的异步控制流模式
在每个
表达式中,函数的执行被暂停,它的状态被保存,并且控制返回到事件循环。一旦等待的await
解决,控制权将返回给异步函数,返回Promise
的实现值。Promise