正确的Node长轮询方式

3

看起来有很多关于如何做这个的讨论,但我没有找到任何具体的例子。我的Node应用程序正在访问一个RESTful API,该API只是要通过到达数据库。我的最初解决方案是这样的:

function getRecord() {
    var req = https.request(options, function(res){
        res.on('data', function(data) {
            var record = JSON.parse(data.toString('utf-8'));
            //do some database things then do it all over
            getRecord();
        });
    });
    req.write(queryString);
    req.end();
}

这实现了我想要的功能。我将继续从API获取新记录,但我不确定这是否是我想要做的最佳方法。


你控制 REST API 吗?如果不是,API 中是否包含任何“注册回调”方法,可以将其挂钩到其中?因此,如果 API 后面的数据发生更改,则 API 将启动对您注册的回调的调用。 - Homer6
我希望这是事实,但不幸的是并非如此。目前提供这些API的公司在其路线图中没有关于将其变成流式或提供回调以便在发布新数据时进行通知的计划。 - ThrowsException
1个回答

1

一个(特别有利的)替代方案是切换到具有消息服务器(如RabbitMQ)的总线架构。

您需要控制API或拥有可以注册回调的API。

长轮询是一种策略,可以快速降低性能并使日志膨胀。如果可能的话,像我上面列出的事件驱动方法更受欢迎。与长轮询不同,事件驱动策略不会引入任何延迟。因此,如果延迟是一个问题,您轮询得越频繁,性能和日志就会越受影响。


我一定会研究消息队列作为解决方案。我可以问一下为什么你首先想到了RabbitMQ作为建议吗? - ThrowsException
实际上很抱歉,我误读了你的答案,以为我不必控制API。尽管如此,我仍然会查看它们,以防它们决定为我们提供流或回调。 - ThrowsException
很遗憾你无法控制API或者有回调。如果你是新手,我非常喜欢这本书:http://www.manning.com/videla/。它比我在这里能更好地解释思想、优缺点。然而,为了解决你的问题,还有很多其他的Rabbit客户端(包括CLI - 请参见http://www.rabbitmq.com/devtools.html)。因此,你可以编写一个简单的定时CLI、Python或PHP脚本,只有在发现新结果时才将消息推送到交换机中。如果你熟悉Python,我建议使用Python的pika包。 - Homer6
这样做的好处是,如果其他服务想利用该API数据,它们不必依赖于您的节点包或API。他们只需监听消息即可。如果您需要每分钟轮询多次,我创建了一个非常稳定的frequent-cron包。我在许多生产环境中使用它。它的有用部分是它会阻塞,因此您不必担心重叠调用。请参见https://github.com/homer6/frequent-cron。 - Homer6
感谢您提供的所有信息。即使我们目前只能使用轮询,消息队列听起来像是一个很好的东西,因为它消除了对节点应用程序的依赖,就像您所说的那样。 - ThrowsException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接