2012-06-16 33 views
5

如何保存node.js的应用程序状态主要由HTTP请求组成的应用程序?在Node.js中保存应用程序状态

我在Node.JS中有一个脚本,它使用RESTful API将大量(10,000多种)产品导入到电子商务应用程序中。该API对可以提出的请求数量有限制,我们正盯着这个限制。在之前的运行中,脚本以Error: connect ETIMEDOUT退出可能是由于超出了API限制。我希望能够尝试连接5次,如果在限制恢复一小时后恢复失败。

如果发生崩溃(电源故障,网络崩溃等),保存整个过程也是有益的。并且能够从停止的位置恢复脚本。我知道Node.js作为一个巨大的事件队列运行,所有的http请求和它们的回调都被放入该队列(以及一些其他事件)。这使其成为保存当前执行状态的主要目标。其他令人愉快的(对于这个项目来说不是完全必要的)将能够在不同网络上的多台机器之间分配工作以增加吞吐量。

那么现在有没有办法做到这一点?一个框架也许?或者我需要自己实现这一点,在这种情况下,如何做到这一点的任何有用的资源,将不胜感激。

+0

你想要的是*持久性作业队列*。他们中有很多人;一个比较好看的是[Kue](http://learnboost.github.com/kue/)(在redis上构建)。 –

+0

我认为你是对的。 Kue相当出色。所以基本上在生产者中,我将阅读我的数据文件,在消费者中,我可以添加/更新每个产品。所以每个产品都将是一项单独的工作。 –

回答

3

我不知道你是什么意思时,你说

我知道的Node.js作为一个巨大的事件队列操作,所有HTTP请求和它们的回调函数得到一些投入该队列(共同其他事件)。这使其成为保存当前执行状态的主要目标

如果您发现它与答案相关,请随时对此发表评论或阐述。

这就是说,如果你只是寻找一个持久性机制这个特殊的任务,我可能会建议Redis,有几个原因:

  • 它允许atomic operations在许多数据类型;例如,如果您在Redis中有一个名为num_requests_made的项目(表示请求数量),则可以使用INCR num_requests_made轻松在Redis中增加此数字,并且它保证是原子级的,这样可以更轻松地扩展到多个工作人员。
  • 它有several data types可能证明对您的需要有用;例如,一个简单的字符串可以表示在特定时间段内(如前一个项目符号点)所做的API请求的数量;您可能会在失败的API请求中存储需要在列表中重新提交的详细信息;等等
  • 它提供了pub/sub mechanisms这将允许你在程序的多个实例之间轻松地进行通信。

如果这听起来很有趣也很有用,而且您还不熟悉Redis,我强烈建议您尝试interactive tutorial,它会向您介绍几种数据类型和命令。另一个很好的阅读材料是A fifteen minute introduction to Redis data types

+0

所以Redis看起来与MongoDB非常相似,除了Mongo没有Pub/Sub功能。对于这个项目来说,分配对于我来说并不像开发速度那么重要。我已经在Node.js(Mongoose)中使用Mongo了。所以我认为坚持它可能会更好,除非你另有想法? 另外我在谈论Node.js中的偶数循环时,我提到队列以及如何按顺序处理所有内容,并在内部表示为一个或多个队列。 –

+0

Redis更注重原子性和速度,但是,如果你知道Mongo,你肯定可以使它适用于这个应用程序,并且如果你想要使用其他的pub/sub工具(ZeroMQ,RabbitMQ等),尽管我会认为Redis更合适,除非你正在做实际的文档存储(而且Kue由Redis支持)。就事件队列而言,我想我明白你在驾驶什么,但我不确定你是如何进入并保存状态而不需要进行自定义的。 –

+0

是的谢谢布兰登:)。你们两个的答案确实帮助我获得了更好的方向感。我会开一个后续问题。如果您或@ dan-d可以添加一个描述如何使用Kue做类似的事情的答案,我会将其标记为答案,谢谢:)。 –