web-dev-qa-db-ja.com

Heroku上のNode.jsとWebおよびWorkerdynoを通信する方法は?

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

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

しかし、Web DynosWorker Dynosの作り方がわかりませんお互いにコミュニケーションする。

たとえば、Web DynosでHTTPリクエストを受信したい

Worker Dynosに送信します

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

、Webで結果を表示します。

これはNode.jsで可能ですか? (RabbitMQまたはKueなどを使用)?

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

または、すべてのコードをWeb DynosおよびスケーリングWeb Dynosのみに実装する必要があります?

33
jwchang

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

あなたがやりたいと思っていることを達成するために、この一般的なアプローチに従ってください:

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

実際の実装に関しては、Node.jsの最高のライブラリについてはあまり詳しくありませんが、このプロセスを結合するコンポーネントは、Herokuで add-ons として入手できます。 /。

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

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

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

38
Ryan Daigle