2013-02-20 23 views
19

原諒我的無知,但來自Django/Python背景我可以看到讓Celery隊列通過後臺較慢的進程工作,同時Web界面儘可能快地更新的巨大好處。節點JS工作人員 - 他們需要什麼?

但是,在Node異步工作的情況下,隊列系統的用例是否大幅減少?

例如:

1 - 用戶發佈內容的網站, 2 - 網站的響應,則郵件管理員。

在Django中,您會將管理​​郵件發送給任務,稍後執行,然後響應請求。芹菜在後臺發送郵件。

在節點中,您打電話給您的郵件程序,然後回覆請求。然後郵件發送一個回叫來說明是否完成,在這一點上用戶已經在查看響應。

那麼,爲什麼我會使用一個隊列與節點?我猜測事情比這更復雜 - 似乎對於交易郵件這些微不足道的事情來說,沒有必要......

或者我誤解了它是如何工作的?

回答

7

你是對的,繼續節點在節點中相當不錯,如果你在單個節點進程中運行所有的東西,那麼就不需要一個隊列。 然而,由於節點是單線程的,節點將無法處理任何新傳入的請求,同時它正忙於發送的電子郵件或處理該任務(如果它是一個CPU密集型任務)

所以,如果你的工作需要一段時間爲了明智地處理CPU,使用外部隊列和單獨的進程來處理這些任務/消息仍然是值得的。 如果你的任務是密集型的,需要一段時間,因爲他們正在等待來自其他服務器的響應,例如,由於節點與io處理得很好,所以再次減少需求。

如果你有一個cpu密集型任務,但你不想部署一個隊列,你可以創建更多的節點進程和機器實例並在它們之間進行負載均衡,所有這些都可以讓他們處理這些任務。這種方法的缺點是你無法單獨擴展網站和後臺處理。 (例如處理web請求和2個工作者實例的5個實例)

+1

因此,如果我想要做一些像調用一個外部API來充實一個用戶信息 - 例如。通過對Google地理編碼器的請求調用進行反向地理編碼。這個請求不會讓我的節點進程停滯在下面的傳入請求中?但是如果有很多CPU使用它會.. ..? – 2013-02-21 10:03:36

+1

你需要對它進行基準測試,但是。這大致是這個想法。看看這裏來了解在等待io操作時可以完成多少操作:http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html。節點一次只能處理一件事,所以如果數字處理的話,它不能處理請求。只要你做任何io,你就可以釋放節點去做其他的事情。 – AndyD 2013-02-21 10:44:51

+3

(邊緣)清晰度的改寫:如果您的並行執行涉及大量等待HTTP或文件系統請求返回的請求,那麼節點的內置異步I/O將爲您提供足夠的並行性。如果您的並行執行涉及在本地運行大型計算(對視頻進行代碼轉換;運行仿真),那麼節點的單線程特性會使您停止工作,如果可能的話,您需要將工作轉移給工作人員。 – Dave 2013-11-13 00:32:54

4

不,總是有用例排隊,即使在節點世界。我見過幾個人使用不同程度成功的基本方法是使用Redis支持的隊列來存儲消息或任務。您可能有一個節點進程將項目添加到隊列中,另一個節點實例處理隊列中的項目。另外,請查看queue modules的節點模塊列表,您會看到相當多的實現。

+0

我明白。我認爲必須有一個原因,有很多的隊列實現,我曾說過,我認爲用例減少,而不是完全... – 2013-02-21 10:00:10

相關問題