0

そのため、実行時間の長い Ruby プロセスがあり、実行するように指示された内容に応じて、さまざまなことを実行します (バイナリ メッセージを使用する EventMachine TCP サーバー)。ここで、特定の人々に、Web インターフェイスを介して特定のプロセスを監視、変更、シャットダウンする機能を提供したいと考えています。そのためにSinatra.rbを使用する予定ですが、より良い代替手段を受け入れています。

私の最初のアイデアは、Sinatra Web インターフェイス (Sinatraに慣れていない人のために、 Rackに基づいています) を a 内Threadで実行し、バックグラウンドで実行させることでした。

ただし、そのようにするとパフォーマンスに影響を与える可能性があると考えていたので、Ruby のIPC機能と代替実装 ( resque、メモリ共有、名前付きパイプなど) を調べることにしました。

私は resque のアイデアが本当に気に入りました (そして名前は本当に機知に富んでいます) が、それが私が必要としているものなのか、それともやり過ぎなのか完全にはわかりません。実際、SinatraEventMachine を使用してどのように実装するのが最適なのかさえわかりません (ただし、resque の完全なドキュメントは読んでおらず、ざっと目を通し、例と使用例を読んだだけです)。

頭に浮かんだ別のアイデアは、シナトラを内部で使用することですがEventMachine::defer、それは本質的に新しい を作成することと同じではありませんThreadか?

私はFibers を使って本格的なことをしたことがないので、その可能性を完全には知りませんが、頭に浮かんだことはありました。

では、これらの (またはより良い方法を提案する) プラクティスのどれが Ruby PCI に最適かを説明します。

ありがとう

4

2 に答える 2

2

シグナルを使用して、実行中のプロセスと通信することをお勧めします。

このアプローチでは、使用しているフレームワークは関係ありませんが
、私の最善の推奨事項はEspresso Frameworkです。

これが取引です。インターフェイス経由でプロセスに送信できるシグナルはたくさんありkillます。

シグナルは、別の Ruby プロセスからのコマンド ラインから送信できます。

必要なのは、送信されたシグナルをアプリ内でキャッチ/トラップすることだけです。

例: 制御されたプロセス内:

# build your app

Signal.trap("USR1") do
  # do some stuff here
end

Signal.trap("USR2") do
  # do another stuff here
end

# run your app

アプリを起動するときは、必ずPID.

PID介してアプリにシグナルを送信できますkill
(いいえ、明示的なシグナルを送信しない限り、アプリは強制終了されません)。

次に、別の Ruby プロセスから次のことができます。

Process.kill "USR1", PID

またはコマンドラインから直接:

kill USR2 PID

そして、アプリは送信シグナルをキャッチ/トラップし、対応することを行います。

必ずPID、制御対象アプリの実際のプロセス ID に置き換えてください。

このプラクティスは、Unicorn Web サーバーでうまく使用されています。

シグナルのリストは次のとおりです。

http://en.wikipedia.org/wiki/Unix_signal

Ruby でのシグナルの操作に関するいくつかの洞察:

https://jellyjelly.net/blog/2010/04/27/unix-signal-programming-in-ruby/

于 2012-11-20T01:44:08.987 に答える
0

RabbitMQ (AMQP の実装) などのローカル メッセージ キューを使用することもできますが、これは実質的に、前述のように Redis を使用するのと同じです。

この種のアプローチは、OS 固有のプロセス間通信メカニズムに依存しません。そうです、別のサービスを実行することになりますが、低レベルのものには結合されません。これは、スケーリングの時期になると非常に良いことです。

于 2012-11-20T05:46:29.993 に答える