2015-06-23 52 views
48

在NodeJS應用程序中處理後臺進程的好方法是什麼?Node.js中的後臺進程

方案:用戶發佈內容到一個應用程序我想緊縮的數據,從外部資源請求額外的數據,等等。所有這一切都非常耗時,所以我想它的REQ/RES後循環。理想的做法是隻需要一個可以快速轉儲作業的作業隊列,守護進程或任務運行者將始終使用最舊的作業並對其進行處理。

在RoR我會用類似Delayed Job的方法做到這一點。什麼是該API的節點等值?

+3

這個問題是一個軟件推薦,因爲它現在是措辭,最終會被關閉。如果您要將最後一句替換爲「此API的NodeJS等效物是什麼?」它變得更主題。我希望看到這回答而不是結束,因爲我需要做類似的事情。 – ssube

+0

謝謝,改寫它。 –

+2

下面的好建議。還有'ChildProcess' API可能是有用的。 https://nodejs.org/api/child_process.html – lispHK01

回答

67

如果您想要輕量級的東西,它與服務器在同一進程中運行,我強烈建議Bull。它有一個簡單的API,可以對隊列進行細粒度的控制。

如果您正在尋找可作爲獨立工作人員進程運行的東西,請查看Kue。它可以作爲RESTful API服務器運行,甚至可以爲其編寫幾個前端應用程序。

如果您熟悉Ruby的Resque,有一個叫Node-resque

公牛,苦厄和Node-resque都是由Redis支持節點執行,這是其中的Node.js工人隊列無處不在。所有3個人都能夠完成RoR的DelayedJob所做的事情,這是您想要的特定功能以及您的API首選項的問題。

+1

這是一個非常好的答案,但提到ChildProcess API和[webworker-threads](https://www.npmjs.com/package/webworker-threads)模塊可以讓它變得很棒。 ;) – ssube

+0

@ssube我不同意你。除非你的意思是創建一個查看隊列來運行某個命令的分支,否則你是對的。從我+1。我使用的是Child_process,我的問題是我可以打開一大組進程,但如果我有辦法管理要在隊列中運行的任務,那麼我會很高興CP是一個很好的解決方案。這是可以做到的,但重點是不要自己完成所有的工作,而是要重新使用經過測試的代碼(在這種情況下,Kue可以完成所有你需要的魔法並允許api集成)。 – dewwwald

17

後臺作業與您的Web服務工作沒有直接關係,因此它們不應該處於相同的過程中。隨着您向上擴展,後臺作業的內存使用量將影響Web服務性能。但是如果你願意的話,你可以把它們放在同一個代碼庫中,不管什麼更合理。

這兩個進程之間的消息傳遞的一個好的選擇是redis,如果每隔一段時間丟棄消息就可以。如果你想「沒有留下任何消息」,你需要一個更重的經紀人,如Rabbit。您的Web服務進程可以發佈,您的後臺作業進程可以訂閱。

這兩個進程不需要共同託管,它們可以位於不同的VM,Docker容器,無論您使用什麼。這可以讓您輕鬆擴展。

+0

真的只有提到兔子的唯一答案?這是企業的答案。 +1 –

-5

我建議使用合適的Node.js框架來構建應用程序。

我認爲最強大和最易於使用的是Sails.js

這是一個MVC框架,所以如果你習慣在ROR中開發,你會發現它非常簡單!

如果您使用它,它已經呈現了一個強大的(以JavaScript形式)作業管理器。

new sails.cronJobs('0 01 01 * * 0', function() { 
    sails.log.warn("START ListJob"); 
}, null, true, "Europe/Dublin"); 

如果您需要更多信息請不要猶豫與我聯繫!

+3

我正在尋找Node的後臺進程管理器。根據定義,這應該與您的網絡應用程序分開。如果您使用Sails,Express,Hapi或其他任何您喜歡的應用程序,則無關緊要。 –

+0

好吧,你可以嘗試Bull或Webworker-Threads ...祝你好運惠特節點.js :) –

+0

它看起來像sails.js是相當大的,比cronJobs做得更多。我找到了node-cron(https://github.com/kelektiv/node-cron),我敢打賭它就是sails.js使用的。 – pbatey

7

如果您使用MongoDB,我推薦Agenda。這樣,單獨的Redis實例就不會運行,並且調度,排隊和Web UI等功能都將出現。 Agenda UI是可選的,當然可以單獨運行。

還建議在您的應用程序邏輯和排隊/調度系統之間建立一個鬆耦合的抽象,這樣整個後臺處理系統可以在需要時換出。換句話說,爲了使它們保持輕量級,請儘可能多地將應用程序/處理邏輯遠離您的日程安排作業定義。

1

我想建議使用Redis作爲調度工作。它有很多不同的數據結構,你可以選擇一個更適合你的用例。

你提到了RoR和DJ,所以我假設你對sidekiq很熟悉。如果需要,您可以使用node-sidekiq進行作業調度,但是它的次優imo,因爲它的主要目的是將nodejs與RoR集成。

對於工人守護進程我建議使用PM2。它被廣泛使用和積極維護。它解決了很多問題(例如部署,監視,集羣),所以確保它不會對你有所幫助。