質問

Heroku Worker Dynoのプロセス間でコミュニケーションをとる方法を知りたいです。

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

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

キューを設定するための私たちのレーキタスクはこれを行います:

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 (具体的には、 Errno::ECONNREFUSED).

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

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

nc localhost 12345 -w 1 </dev/null

しかし、これも接続しません。

現在、使用するクライアント/サーバーコードの変更を調査しています UNIXSocket とは対照的に両側 TCPSocket, 、しかし、それは既製のソフトウェアであるため、可能であれば独自のフォークを避けたいと思います。

役に立ちましたか?

他のヒント

メッセージキューHerokuアドオンを使用してください...

お気に入り Ironmq 例の場合

あなたの質問を読んで、あなたはあなた自身の質問に答えました、あなたはLocalHost 12345に接続することはできません。

プロセスを設定するこの方法は、1つのHeroku Dyno内で2つのプロセスを実行しているため、Herokuの多くの利点を削除するため、プロセスを設定するこの方法は奇妙なものです。 独立したプロセススケーリング, 隔離削除宣言と隔離をきれいにします.

サードパーティのバッキングサービスを介して相互作用する2つの別々のプロセスとしてこれを実行することを強くお勧めします。

Herokuは、Dynoあたりの特定のポート($ポート)でのみ聞くことができると思います。

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

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

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

@makdad、「サードパーティのソフトウェア」はRubyで書かれていますか?もしそうなら、私はそれを偽造する猿のパッチでそれを実行します TCPSocket または、TCPソケットにアクセスするために使用しているクラス。モンキーパッチを独自のファイルに入れてください。 それだけ サードパーティソフトウェアを実行しているRubyプロセスで必要です。モンキーパッチは、キューから直接データを読み取ることさえでき、 TCPSocket そのデータが受信されたかのように振る舞います。

はい、それはそれほどエレガントではありません、そして私はそれをするためのより良い方法があるかもしれないと確信していますが、あなたはいつ仕事をしようとしているのですか(研究をして何日も費やさない)、時々あなたはただ弾丸を噛んでやる必要があります醜いが機能するもの。どんなソリューションでも、プロジェクトに取り組む人のためにそれを文書化してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top