仅在新数据可用时调用外部API

时间:2018-04-11 01:14:11

标签: node.js api express npm

我正在为我的用户提供从外部API获取的数据。现在,我不知道这个API何时会有新数据,例如,使用Node的最佳方法是什么?

我已经尝试过setInterval和node-schedule来做到这一点并让它运行起来,但CPU的价格是不是很高?例如,一天之内我会点击此端点每分钟检查一次新数据,但每五分钟或更长时间可能会有新数据。

问题是,这个外部API并非由我运行。检查每分钟更新的唯一方法是什么?是否有任何模块可以在Node或任何更适合的方法中做到这一点?

用例1 :为国家/地区的每个城市调用天气API,只需在给定城市下雨时将数据保存到我的数据库中。

使用案例2 :在打开指定的飞利浦Hue指示灯时,向用户发送通知,而无需点击端点以检查其是否打开。

我很感谢有时间讨论这个问题。

2 个答案:

答案 0 :(得分:2)

如果此外部API无法在有新数据时通知您,那么您唯一能做的就是"民意调查"它来检查新数据。

你必须决定什么是高效的设计"用于轮询的是在您的特定应用程序中,并给出数据类型和客户端的需求(新数据的可接受延迟)。

您还需要确保您的服务没有违反任何服务条款与您的轮询方案或违反速率限制,如果您使用它可能会拒绝您访问服务器"太多"

  

检查每分钟更新一次的唯一方法是什么?

除非API提供某些通知功能,否则除了在某个时间间隔轮询之外,没有其他方案。每分钟轮询相当快。您的客户真的需要不到一分钟的信息吗?或者如果信息的时间长达5分钟,它真的没有区别。

例如,在您的天气示例中,客户不会经常需要每10-15分钟更新一次温度更新。

  

是否有任何模块可以在Node或任何更适合的方法中做到这一点?

没有。并不是的。您可能只是使用某种计时器(在node.js应用中重复setTimeout()setInterval()来重复执行您的API操作。

  

使用案例:为国家/地区的每个城市调用天气API,只需在给定城市下雨时将数据保存到我的数据库中。

尝试从外部API预先保存每一个可能的数据可能是一个失败的主张。你本质上是在努力去刮擦"来自外部API的所有数据。这很可能违反服务条款,并可能与利率限制相冲突。并且,它不太实用。

相反,您可能希望根据需要获取数据(当客户端请求Phoenix的数据时,然后,只有这样,您是否开始为Phoenix收集数据)然后一次需要某种类型的数据(温度在特定的城市中建立,然后您可能希望更频繁地预先缓存该数据,以便您可以通知客户更改。如果过了一段时间,没有客户要求凤凰城提供数据,那么您再停止向Phoenix请求更新,直到客户再次建立需求为止。

  

我已经尝试过setInterval和node-schedule来做到这一点并让它运行起来,但CPU的价格是不是很高?例如,一天之内我会点击此端点每分钟检查一次新数据,但每五分钟或更长时间可能会有新数据。

即使您每分钟都在进行远程网络请求,也不是CPU密集型操作。 node.js使用非阻塞网络,所以在网络请求期间的大部分时间,node.js都没有做任何事情,根本就没有使用CPU。 CPU短暂使用的唯一时间是首次发送API请求,然后从API调用收到结果并需要处理它。

你是否真的需要"民意调查"每一分钟都取决于数据和客户的需求。如果您每隔5分钟检查一次新数据,我会问自己,您的应用是否会正常工作。

答案 1 :(得分:1)

我将用于更新的方法将包含在计划批处理/ powershell / bash文件中的代码之外。在Windows中,您可以根据自上次运行以来的时间或持续时间来安排任务,因此您可以执行的操作是一个简单的命令,该命令将使您的应用程序终止五分钟,运行 npm update < / strong>,然后在关闭shell之前重新启动应用程序。

这样您就可以避免使用API​​并将代码保持在最低限度,如果您的代码位于更新中的Node包中,那么一旦您进行了严格的应用程序更改,它就会准备就绪或者您需要关闭服务器以进行维护并更新低级代码。

这对您来说是一种轻量级的解决方案,它是我在工作场所使用过一次或两次的方法。那里有很多选择,如果这不是你要找的东西,我可以继续关注你。