Heroku Worker Dynoのプロセス間のTCPソケット通信
質問
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
そのデータが受信されたかのように振る舞います。
はい、それはそれほどエレガントではありません、そして私はそれをするためのより良い方法があるかもしれないと確信していますが、あなたはいつ仕事をしようとしているのですか(研究をして何日も費やさない)、時々あなたはただ弾丸を噛んでやる必要があります醜いが機能するもの。どんなソリューションでも、プロジェクトに取り組む人のためにそれを文書化してください。