2013-05-02 62 views
3

似乎有很多讨论如何做到这一点,但我还没有找到任何具体的例子。我的节点应用程序正在访问正在传递到数据库的RESTful 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获取新记录,但我不确定这是否是实现我想要的最佳方法。

+0

您是否控制REST API?如果没有,API是否包含任何可以挂钩的“注册回调”方法?所以,如果数据在API后面改变,那么API会启动对注册回调的调用。 – Homer6 2013-05-02 20:19:49

+0

我希望这是这种情况,但不幸的是,没有。目前,提供这些apis的公司在其路线图中没有任何关于使其流式传输或为新数据发布时提供回调的问题。 – ThrowsException 2013-05-02 21:20:56

回答

1

一种(特别有利的)替代方法是使用消息服务器(如RabbitMQ)切换到总线体系结构。

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

长轮询是一种可以非常快速地降低性能和膨胀日志的策略。事件驱动的方法,就像我上面列出的那样,如果有可能的话,它是非常受欢迎的。而且,与长时间轮询不同,事件驱动策略不会引入任何延迟。所以如果延迟是一个问题,你调查的频率越高,它越会降低性能和膨胀日志。

+0

我一定会研究一个消息队列作为解决方案。我可以问为什么RabbitMQ作为一个建议跳到你头脑的前面? – ThrowsException 2013-05-02 21:26:49

+0

实际上很抱歉误读你的答案,因为我不必控制api。尽管如此,如果他们决定向我们提供流式传输或回调,我仍然会看看他们。 – ThrowsException 2013-05-02 21:52:58

+0

这对于不能控制API或回调而言太糟糕了。如果你是消息服务器的新手,在进入他们的网站时,我非常喜欢这本书:http://www.manning.com/videla/它更好地解释了我可以在这里做的意识形态,优点和缺点。但是,要解决您的问题,还有很多其他的兔子客户端(包括CLI - 请参阅http://www.rabbitmq.com/devtools.html)。因此,您可以编写一个简单的croned CLI,Python或PHP脚本,它只在发现新结果时将消息推送到交换中。如果您熟悉python,我推荐Python的pika包。 – Homer6 2013-05-02 22:14:34