我有一个使用Restify的Google,它基本上是在Node.JS工作表中使用的其他几个api的聚合器。
当Google工作表最初打开时,它向我的服务器发出几个请求,从各种API请求一堆数据,然后我的服务器会尽职尽责地查找并返回这些数据。
我已经实现了基本的基于内存的缓存--如果对相同数据的请求进来了,它会从内存中为它提供服务,直到过期时间到来(我很快就会转向Redis )。
我的问题是,当第一个请求仍在查找/解析/服务时,对相同数据的第二个请求经常会出现,这意味着我正在并行请求相同(几of )的数据。
我如何有效地暂停第二个请求,并让它等待,直到第一个请求的数据可用?我不介意有一个很高的超时时间,并在第二个请求开始之前等待第一个请求结束,或者也可以采用某种“后退并立即重试”的逻辑。
我认为某种承诺或保存回调对此最好,但我不确定有什么最佳实践或建议的方法来实现这一点。
我不可能在服务器端定期请求和缓存数据,因为客户端可以请求的值的潜在范围相当高。
发布于 2018-06-08 07:55:25
保持承诺的缓存。如果请求正在进行中,缓存将指示它已经被请求,您仍然可以await
未解析的promise,然后在数据准备就绪时响应这两个请求。
您的其余代码将需要重构,以await
缓存中的值,而不管promises是否已解析,并在请求启动而不是完成时向缓存中添加条目。
如果缓存中的promise已经被解决,那么await
只会在事件循环中停止用户函数的异步流,这意味着您可以免费查看挂起的请求。
https://stackoverflow.com/questions/50751591
复制相似问题