替代“通知URL”来处理节点中长时间运行的API进程

时间:2016-10-10 19:08:48

标签: javascript node.js api express

我正在构建一个需要很长时间才能返回数据的API,转换发生时最多需要60秒。在运行时,我想让用户随时了解任何错误,并告知他们我们所处的转换阶段中的哪个流程。

这在客户端非常简单,因为我可以简单地发送一个WebSocket事件,但是对于公共API,这不太实用。

我知道我可以请求通知URL并将更新发送到给定的URL,但这看起来很麻烦,而且可能会造成很大的资源。还有另一种更有效的方法来发送进度通知吗?

理想情况下,使用api的用户可以进行设置。

.on("error", function(err) { //handle error });

或者那种效果。

1 个答案:

答案 0 :(得分:1)

您并不清楚API的消费者是谁,他们使用什么类型的客户,或者工作流程是什么样的。因此,根据您正在寻找的内容以及您可用的资源,有很多不同的答案。

非详尽清单:

REST端点轮询

理解你不是粉丝,但这仍然是为广大客户提供服务的最好方法之一,是纯粹浏览器中仅有的两种(我知道)方法之一基于客户。性能方面,如果您正确设置缓存策略并为您的客户设置限制(无论如何您应该这样做),这并不可怕。我不同意它是客户使用消费的PITA,但是这种观点和你显然有不同的看法。缓解PITA的一种方法是提供一种SDK,为消费者处理该机制。

网络套接字

我知道您可能正在与不在网上开始的客户打交道,但如果客户端可以发出RESTful请求,您可以将服务器设置为在客户端广告兴趣时进行Web套接字升级建立同样的。我不是这个选项的粉丝,因为它对我来说感觉更复杂(更多移动部件),但如果您喜欢Web套接字并且所有/大多数客户端都支持Web套接字,那么它是一个选项。或者您可以将REST响应作为您为该客户端打开的Web套接字的URL。

网络隐藏

如果您的客户可能是其他计算机(尤其是服务器),那么Web挂钩是一种非常好的方法,特别是如果您要引发的事件可能多次发生并且间隔时间不可预测。在此方案中,客户端向您发出REST请求,它们发送给您的部分数据包括一个URL,您将在事件发生时将数据发送到(以API中指定的格式)。显然,他们要么必须将该URL打开到您的POST,否则您可以就服务器将尊重的某种凭证达成一致。

TCP套接字

与Web Socket选项类似,您可能会在端点上发出REST请求,然后使用套接字连接信息/ URI响应自定义TCP套接字。这有点不标准,但在正确的用例中非常有用和高效。我暂时没有使用它,所以他们可能已经改变了它,但这就是Heroku的API用于处理流日志的方式。

发布/订阅或消息队列或类似内容

Redis可以像其他许多人那样做到这一点。在这种情况下,您可以制作更通用的解决方案,其中可能有多个客户端可以订阅的事件通道,依此类推。我不喜欢出于安全原因直接暴露Redis,这意味着你仍然需要弄清楚如何处理Redis和客户端之间的通信(见上文),但是在引擎盖下使用它至少会给你买一些处理出版商和订阅者的概念逻辑等;如果你有多个事件,我说的很有用。不过,这是一个比上述更重要的解决方案,并且会使您的系统管理员开销增加一些(取决于您的高可用性需求等)

相关问题