首页 > 解决方案 > Node.js API - 来自多个客户端的重复数据请求

问题描述

我有一个使用 Restify 的 Node.JS api,它基本上是其他几个 API 的聚合器,可在 Google 工作表中使用。

当最初打开 Google 表格时,它会向我的服务器发出多个请求,以从各种 API 请求一堆数据,然后我的服务器会尽职尽责地查找并返回这些数据。

我已经实现了基本的基于内存的缓存 - 如果对相同数据的请求进入,它将从内存中提供它,直到达到到期时间(我愿意很快迁移到 Redis)。

我的问题是,当第一个请求仍在查找/解析/服务时,经常会收到对相同数据的第二个请求,这意味着我正在并行请求相同(几 GB)的数据。

如何有效地暂停第二个请求并让它等到第一个请求中的数据可用?我不介意有一个高超时并在第二个请求开始之前等待第一个请求结束,或者某种“后退并在一分钟内重试”逻辑是可行的。

我想某种形式的承诺或在某处保存回调将是最好的,但我不确定有什么样的最佳实践或建议的方法。

我不可能在服务器端定期请求和缓存数据,因为客户端可以请求的潜在值范围相当高。

标签: javascriptnode.jsrestapi-designrestify

解决方案


保留承诺的缓存。如果请求正在进行中,缓存将指示它已被请求并且您仍然可以await未解决的承诺,然后在数据准备好时响应这两个请求。

await无论承诺是否被解析,其余代码都需要重构为缓存中的值,并在请求启动而不是完成时将条目添加到缓存中。

如果缓存中的 promise 已经被解析,那么await只会在事件循环中通过一个滴答声来停止用户函数的异步流程,这意味着您可以获得基本上免费查看待处理请求的优势。


推荐阅读