2012-06-16 68 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做類似的事情的答案,我會將其標記爲答案,謝謝:)。 –