Node.js API - 来自多个客户端的重复数据请求
Node.js API - Duplicate data requests from multiple clients
我有一个使用 Restify 的 Node.JS api,它基本上是其他几个 API 的聚合器,用于 Google sheet。
当 Google sheet 最初打开时,它向我的服务器发出多个请求,以请求来自各种 API 的一堆数据,然后我的服务器尽职尽责地查看这些数据向上 returns.
我已经实现了基本的基于内存的缓存 - 如果收到对相同数据的请求,它将从内存中为它提供服务,直到达到到期时间(我愿意很快转移到 Redis)。
我的问题是,当第一个请求仍在查看时,经常会收到对相同数据的第二个请求 up/parsed/served,这意味着我正在并行请求相同(几千兆字节)的数据.
如何有效地暂停第二个请求并让它等到第一个请求的数据可用?我不介意有一个高超时并等待第一个请求在第二个请求开始之前结束,或者某种 "back off and try again in a minute" 逻辑是可行的。
我认为某种承诺或在某处保存回调对此是最好的,但我不确定对此有哪些最佳实践或建议方法。
我不可能定期请求和缓存数据服务器端,因为客户端可以请求的值的潜在范围相当高。
保留承诺缓存。如果请求正在进行中,缓存将指示它已被请求,您仍然可以 await
未解决的承诺,然后在数据准备好时响应两个请求。
您的其余代码将需要重构为 await
缓存中的值,无论承诺是否得到解决,并在发起请求时向缓存添加条目,而不是完成。
如果缓存中的承诺已经解决,那么 await
只会通过事件循环中的单个滴答停止用户函数的异步流,这意味着您基本上可以看到待处理的请求免费。
我有一个使用 Restify 的 Node.JS api,它基本上是其他几个 API 的聚合器,用于 Google sheet。
当 Google sheet 最初打开时,它向我的服务器发出多个请求,以请求来自各种 API 的一堆数据,然后我的服务器尽职尽责地查看这些数据向上 returns.
我已经实现了基本的基于内存的缓存 - 如果收到对相同数据的请求,它将从内存中为它提供服务,直到达到到期时间(我愿意很快转移到 Redis)。
我的问题是,当第一个请求仍在查看时,经常会收到对相同数据的第二个请求 up/parsed/served,这意味着我正在并行请求相同(几千兆字节)的数据.
如何有效地暂停第二个请求并让它等到第一个请求的数据可用?我不介意有一个高超时并等待第一个请求在第二个请求开始之前结束,或者某种 "back off and try again in a minute" 逻辑是可行的。
我认为某种承诺或在某处保存回调对此是最好的,但我不确定对此有哪些最佳实践或建议方法。
我不可能定期请求和缓存数据服务器端,因为客户端可以请求的值的潜在范围相当高。
保留承诺缓存。如果请求正在进行中,缓存将指示它已被请求,您仍然可以 await
未解决的承诺,然后在数据准备好时响应两个请求。
您的其余代码将需要重构为 await
缓存中的值,无论承诺是否得到解决,并在发起请求时向缓存添加条目,而不是完成。
如果缓存中的承诺已经解决,那么 await
只会通过事件循环中的单个滴答停止用户函数的异步流,这意味着您基本上可以看到待处理的请求免费。