Node.jsのバックグラウンドプロセス


96

NodeJSアプリケーションでバックグラウンドプロセスを処理する良いアプローチとは何ですか?

シナリオ:ユーザーがアプリに何かを投稿した後、データをクランチしたり、外部リソースから追​​加のデータを要求したりします。これらはすべて非常に時間がかかるため、req / resループから除外します。理想的には、ジョブをすぐにダンプできるジョブのキューを用意し、デーモンまたはタスクランナーが常に最も古いジョブを取得して処理することです。

RoRでは、Delayed Jobのようなものでそれを実行したでしょう。このAPIに相当するNodeは何ですか?


4
質問は、ソフトウェアの推奨事項です。これは現在フレーズされているため、終了することになります。最後の文を「このAPIに相当するNodeJSとは何ですか?」に置き換えた場合 もっと話題になります。私は同様のことをする必要があるので、私はこれが閉じられたのではなく答えられることを望みます。
ssube 2015年

ありがとう、言い換えた。
Ole Spaarmann、2015年

2
以下の良い提案。ChildProcess役に立つかもしれないAPI もあります。nodejs.org/api/child_process.html
lispHK01

stackoverflow.com/users/69349/ole-spaarmann-最終的に何を選択したかを知り、決定をNodeJSとどのように統合したかを示す非常に簡単な例を提供できるかどうか、感謝します。
MLissCetrus

@MLissCetrus Elixirを学び、NodeJSをもう使わないことにしました:)
Ole Spaarmann

回答:


114

サーバーと同じプロセスで実行される軽量なものが必要な場合は、Bullを強くお勧めします。キューをきめ細かく制御できるシンプルなAPIがあります。

スタンドアロンのワーカープロセスとして実行されるものを探している場合は、おそらくKueを調べてください。RESTful APIサーバーとして実行でき、そのためにいくつかのフロントエンドアプリも作成されています。

RubyのResqueに慣れている場合は、Node-resqueというノード実装があります。

Bull、Kue、およびNode-resqueはすべて、Node.jsワーカーキューの至る所にあるRedisによってサポートされています。3つすべてで、RoRのDelayedJobの機能を実行できます。これは、必要な特定の機能とAPI設定の問題です。


3
これは非常に良い答えですが、ChildProcess APIとwebworker-threadsモジュールについて言及すると、すばらしい結果になる可能性があります。;)
ssube 2015年

@ssube私はあなたに同意しません。あなたが正しいコマンドを実行するためにキューを見るフォークを作成するつもりでない限り。私からの+1。Child_processは私が使用しているもので、問題は膨大な数のプロセスを開くことができるということですが、キューで実行されるタスクを管理する方法があれば、CPが優れたソリューションであることを嬉しく思います。これは可能ですが、ポイントはすべての作業を自分で行うのではなく、戦闘テストされたコードを再利用することです(この場合、Kueのような、必要なすべての魔法を実行し、API統合を許可します)。
dewwwald 2017

BullはPM2クラスタリングで動作しますか?または、ドキュメントに示されているように、独自のクラスターを手動で作成する必要がありますか?
Shayan Nahrvar

30

バックグラウンドジョブは、Webサービスの作業に直接関連していないため、同じプロセス内にあるべきではありません。スケールアップすると、バックグラウンドジョブのメモリ使用量がWebサービスのパフォーマンスに影響します。ただし、必要に応じて、同じコードリポジトリにそれらを配置できます。

2つのプロセス間でメッセージを送信するための適切な選択肢の1つは、メッセージを時々ドロップしても問題がない場合、redisです。「メッセージを残さない」場合は、Rabbitのようなよりヘビーなブローカーが必要です。Webサービスプロセスを公開し、バックグラウンドジョブプロセスをサブスクライブできます。

2つのプロセスを共ホストする必要はありません。使用するものは何でも、別々のVM、Dockerコンテナーに置くことができます。これにより、問題なくスケールアウトできます。


3
本当にウサギについて言及した唯一の答えは?これが企業の答えです。+1
Augie Gardner 2017

11

MongoDBを使用している場合は、アジェンダをお勧めします。この方法では、個別のRedisインスタンスは実行されておらず、スケジューリング、キューイング、Web UIなどの機能がすべて存在します。 アジェンダUIはオプションであり、個別に実行できます。

また、必要に応じてバックグラウンド処理システム全体を交換できるように、アプリケーションロジックとキューイング/スケジューリングシステムの間に疎結合の抽象化を設定することをお勧めします。言い換えれば、それらを軽量に保つために、できるだけ多くのアプリケーション/処理ロジックをアジェンダジョブ定義から遠ざけます。


3

ジョブのスケジュールにRedisを使用することをお勧めします。さまざまなデータ構造が豊富にあり、いつでもユースケースに適したデータ構造を選択できます。

RoRとDJについて言及されたので、あなたはsidekiqに精通していると思います。node-sidekiqを使用できます必要に応じて、ジョブスケジューリングにをが、その目的はnodejsをRoRと統合することであるため、最適ではありません。

ワーカーのデーモン化には、PM2の使用をお勧めします。広く使用されており、アクティブに保守されています。それは多くの問題(例えば、配備、監視、クラスタリング)を解決するので、それがあなたにとってやり過ぎではないことを確認してください。


1

ビーキューブルを試して、結局ブルを選びました。私は最初にビーキューb / cを選択しました。それは非常に単純で、その例は理解しやすいですが、ブルの例は少し複雑です。ミツバチのウィキビーキューの起源も私に共鳴します。しかし、蜂の問題は、<1>の問題解決時間が非常に遅く、最新の更新が10か月前であったことです。<2>ジョブを一時停止/キャンセルする簡単な方法が見つかりません。

一方、Bullは頻繁にコードを更新し、問題に対応します。Node.jsジョブキューの評価では、強気の弱点は「問題解決の時間が遅い」とのことですが、私の経験は逆です。

ただし、いずれにしてもAPIは似ているため、APIを切り替えるのは非常に簡単です。


-6

適切なNode.jsフレームワークを使用してアプリを構築することをお勧めします。

最も強力で使いやすいのはSails.jsだと思います。

これはMVCフレームワークなので、RORでの開発に慣れている場合は、非常に簡単です。

あなたがそれを使うなら、それはすでに強力な(JavaScript用語で)ジョブマネージャを提供しています。

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

あなたがより多くの情報を必要とするならば、私に連絡することを躊躇しないでください!


5
Nodeのバックグラウンドプロセスマネージャーを探しています。定義上、これはWebアプリから分離する必要があります。また、Sails、Express、Hapiなど、好きなものを使用してもかまいません。
Ole Spaarmann、2015年

BullまたはWebworker-Threadsを試すことができます... Node.jsで幸運を祈ります:)
Zio MakSò2015年

sails.jsはかなり大きく、cronJobsよりもはるかに多くのことを行うように見えます。私は、sails.jsが使用しているのは間違いない、node-cron(github.com/kelektiv/node-cron)を見つけました。
pbatey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.