12

Heroku ワーカー dyno でプロセス間で通信する方法を知りたいです。

Resque ワーカーがキューから読み取り、同じ dyno で実行されている別のプロセスにデータを送信するようにします。「他のプロセス」は、通常は TCP ソケット (ポート xyz) を使用してコマンドをリッスンする市販のソフトウェアです。Resque ワーカーが開始する前に、バックグラウンド プロセスとして実行するように設定されています。

ただし、その TCP ソケットにローカルで接続しようとすると、どこにも行きません。

キューを設定するための Rake タスクは次のことを行います。

task "resque:setup" do
  # First launch our listener process in the background
  `./some_process_that_listens_on_port_12345 &`

  # Now get our queue worker ready, set up Redis backing store
  port = 12345
  ENV['QUEUE'] = '*'  
  ENV['PORT'] = port.to_s
  Resque.redis = ENV['REDISTOGO_URL']

  # Start working from the queue
  WorkerClass.enqueue
end

リスナー プロセスが実行され、Resque がキューに入れられたタスクを処理しようとします。localhost:12345ただし、 (具体的には)に接続できないため、Resque ジョブは失敗しErrno::ECONNREFUSEDます。

おそらく、Heroku は同じ dyno で TCP ソケット通信をブロックしています。これを回避する方法はありますか?

私は状況から「コード」を取り出そうとし、コマンドラインで実行しました(サーバープロセスが12345に適切にバインドされていると主張した後):

nc localhost 12345 -w 1 </dev/null

しかし、これもつながりません。

現在、クライアント/サーバー コードを変更しUNIXSocketTCPSocket.

4

5 に答える 5

5

メッセージ キューの Heroku アドオンを使用する ...、

たとえばIronMQのように

于 2012-02-22T15:03:35.127 に答える
2

あなたはFifoを試しましたか?

http://www.gnu.org/software/libc/manual/html_node/FIFO-Special-Files.html#FIFO-Special-Files

于 2012-02-26T13:23:36.020 に答える
1

Herokuでは、dynoごとに特定のポート($ PORT)でしか聞くことができないと思います。

ここに2つの解決策があります。

  • 通信ミドルウェアとしてRedisを使用すると、ワーカーはRedisに再度書き込みを行い、ポートでリッスンする代わりにリスナープロセスがRedisに新しいジョブを照会します。

  • 別のherokudyno(またはより良い、完全に異なるアプリケーション)を入手し、そこでリスニングプロセス($ PORT)を起動して、両方のアプリケーションを通信します

于 2012-02-20T11:30:36.897 に答える
1

あなたの質問を読んで、あなたは自分の質問に答えました.localhost 12345に接続できません.

プロセスをセットアップするこの方法は、1 つの Heroku dyno 内で 2 つのプロセスを実行すると、Heroku の多くの利点 (独立したプロセスのスケーリング分離クリーンな依存関係の宣言と分離) が失われるため、奇妙です。

これを、サードパーティのバッキング サービスを介してやり取りする 2 つの別個のプロセスとして実行することを強くお勧めします。

于 2012-02-20T11:17:25.450 に答える