37

Web Dynoは HTTP リクエストを処理できます

Web Dynoがそれらを処理している間、Worker Dynoはそこからジョブを処理できます。

しかし、 Web DynoWorker Dynoが互いに通信するようにする方法がわかりません。

例えばWeb DynosでHTTPリクエストを受け取りたい

、それをWorker Dynosに送信します

、ジョブを処理し、結果をWeb Dynosに送り返す

、ウェブで結果を表示します。

これはNode.jsで可能ですか? (RabbitMQ や Kue などで)?

Heroku Documentationに例が見つかりませんでした

それとも、すべてのコードをWeb Dynoに実装し、 Web Dynoのみをスケーリングする必要がありますか?

4

2 に答える 2

41

バックグラウンド ジョブとキューイングに関する高レベルの記事で示唆されているように、Web dyno は中間メカニズム (多くの場合キュー) を介してワーカー dyno と通信する必要があります。

やりたいと思っていることを達成するには、次の一般的なアプローチに従います。

  • Web dyno が Web リクエストを受信
  • Web dyno がキューにジョブを追加します
  • ワーカー dyno がキューからジョブを受け取る
  • ワーカー dyno がジョブを実行し、進行状況の増分を共有コンポーネントに書き込みます
  • ブラウザー側のポーリングは、Web dyno からのジョブのステータスを要求します
    • Web dyno が共有コンポーネントにバックグラウンド ジョブの進行状況を照会し、状態をブラウザに送り返す
  • ワーカー dyno がジョブの実行を完了し、共有コンポーネントで完了としてマークします
  • ブラウザー側のポーリングは、Web dyno からのジョブのステータスを要求します
    • Web dyno は共有コンポーネントにバックグラウンド ジョブの進行状況を照会し、完了した状態をブラウザーに送り返します

実際の実装に関する限り、私は Node.js の最高のライブラリにあまり詳しくありませんが、このプロセスを結び付けるコンポーネントは、アドオンとして Heroku で利用できます。

キュー: AMQP は十分にサポートされているキュー プロトコルであり、CloudAMQPアドオンは Web とワーカー dyno 間のメッセージ キューとして機能できます。

共有状態: Postgresアドオンの 1 つを使用して、処理中のジョブの状態、またはMemcacheRedisなどのよりパフォーマンスの高いものの状態を共有できます。

つまり、Heroku の dyno 間で通信するには、中間アドオン コンポーネントを使用する必要があります。このアプローチにはもう少しエンジニアリングが必要ですが、その結果、適切に分離されたスケーラブルなアーキテクチャが得られます。

于 2012-07-11T17:43:50.750 に答える
-4

私が知る限り、Heroku は通信手段を提供していないため、自分で構築する必要があります。ノードを使用して別のプロセスと通信するには、おそらくプロセスの stdin/out/err を次のように手動で処理する必要があります。

var attachToProcess = function(pid) {
    return {
        stdin: fs.createWriteStream('/proc/' + pid + '/fd/0'),
        stdout: fs.createReadStream('/proc/' + pid + '/fd/1'),
        stderr: fs.createReadStream('/proc/' + pid + '/fd/2')
    };
};

var pid = fs.readFile('/path/to/worker.pid', 'utf8', function(err, pid) {
    if (err) {throw err;}
    var worker = attachToProcess(Number(pid));
    worker.stdin.write(...);
});

次に、ワーカー プロセスで、その pid ファイルに pid を保存する必要があります。

fs.writeFile('/path/to/worker.pid', process.pid, function(err) {
    if (err) {throw err;}
});

私は実際にこれをテストしていないので、作業と構築が必要になる可能性がありますが、基本的な考え方は明らかだと思います.

編集

node_redis readmeで説明されているように、redis pub/sub を使用してさまざまなプロセス間で通信することもできることを追加する必要があると思いまし

于 2012-07-11T10:33:02.677 に答える