我有一个使用Restify的Node.JS api,它基本上是在Google表格中使用的其他几个API的聚合器。
最初打开Google表格时,它会向我的服务器发出多个请求,要求从各种API中获取大量数据,然后我的服务器会尽职地查找并返回。
我已经实现了基于内存的基本缓存 - 如果对相同数据的请求进入,它将从内存中提供,直到达到到期时间(我很快就会转到Redis)。
我的问题是,当第一个请求仍然被查找/解析/提供时,会定期第二次请求相同数据,这意味着我并行请求相同(几千兆字节)的数据
如何有效地暂停第二个请求并让它等到第一个请求的数据可用?我不介意有一个高超时并等待第一个请求在第二个开始之前结束,或者某种类型的"退出并在一分钟后再试一次"逻辑是可行的。
我想某种承诺或保存回调在某个地方最适合这种情况,但我不确定为此采用何种最佳做法或建议的方法。
我不可能定期请求和缓存数据服务器端,因为客户端可以请求的潜在值范围相当高。
答案 0 :(得分:1)
保留承诺缓存。如果请求正在进行中,缓存将指示它已被请求,您仍然可以await
未解决的承诺,然后在数据准备就绪时响应这两个请求。
无论promise是否已解析,您的其余代码都需要重构为await
缓存中的值,并在启动请求而不是完成请求时向缓存添加条目。
如果缓存中的promise已经解决,那么await
只会在事件循环中通过单个tick停止用户函数的异步流,这意味着您可以获得基本上免费查看待处理请求的优势