0

短いバージョン: Rails コントローラー (Rails 3 を使用) からサブプロセス (Ruby スクリプト) を起動し、サブstdoutプロセスから Web ページにメッセージをレンダリングし、Rails ビューからサブプロセスに情報を渡す必要があります。

セットアップ: Ivyと呼ばれるソフトウェア メッセージング バス システムと通信する Ruby スクリプトがあり、Ruby 1.9.3 を使用して、ネットワーク上の他の場所で実行されているハードウェアとの間で制御メッセージを送受信します。ここでは代替メッセージング システムを使用できません。Ivy に違いありません。スクリプトは現在、メッセージを に書き込みますstdout

問題 1: Rails アプリのコントローラーから、このスクリプトをサブプロセス (またはスレッド、提案を受け付けています) として起動したいと考えています。このスクリプトからメッセージを受信して​​、Web ページに表示できるようにしたいと考えています。これらのメッセージをデータベースに永続的に保存する必要はないため、Rails キャッシュを使用してメッセージを一時的に保存およびアクセスし、AJAX を使用して定期的に新しいメッセージのキャッシュをポーリングすることを検討していました。これは可能ですか?

問題 2:同じ Rails アプリが、Web ページから (たとえば、ユーザーがボタン、ドロップダウン、またはその他の UI 要素と対話することによって) コントロール メッセージを Ivy サブプロセスに送信できる必要があります。これにより、これらのコントロール メッセージは、ハードウェア。

SidekiqDelayed Jobなどの潜在的な解決策を調べましたが、ドキュメントを閲覧しても、これらの潜在的な解決策が問題1と2の両方を解決できるという決定的な証拠を見つけることができません。したがって、私の質問は次のとおりです。

  1. Sidekiq や DelayedJob のような既製のソリューションでこのタスクを処理できますか?
  2. これを達成できるように、すでにRailsに組み込まれている方法はありますか?
  3. この質問は意見に近いですが、とにかく質問します。私が Rails を追求する理由は他にもありますが、このタスクが非常に困難になる場合は、その理由は切り捨てられる可能性があります。Rails を使用してこのようなことを行うのは面倒なので、別の解決策を検討する必要がありますか?
4

2 に答える 2

1

3つの懸念があるようです:

  1. メッセージの ivybus の監視
  2. ivybus 経由でコマンドを送信する
  3. ユーザー インタラクション (Web インターフェイス)

Rails フレームワークは 3 番目の問題を解決しているだけです。ただし、Ruby/Rails がこの仕事に適したツールではないというわけではありません。これを設定する際に私が持っているいくつかの考えを次に示します。

懸念事項 1 は、何らかのバックグラウンド ジョブで確実に発生しているはずです。これは、標準の Web 要求の一部であってはなりません。懸念事項 2 は、バックグラウンド ジョブでもうまく機能すると私は主張します。エラーが発生しやすいタスクや長時間実行される可能性のあるタスクは、可能な限り Web リクエストから除外する必要があります。

これらのタスクをバックグラウンドで実行するには、いくつかの方法があります。Sidekiq は、懸念事項 2 (コマンドの送信) に対する完璧なソリューションです。コントローラーはユーザーから何らかのアクションを実行する要求を受け取り、コントローラーはそれを実行するためにバックグラウンド ワーカーにジョブを送信します。Sidekiq は懸念事項 1 (監視) も解決できますが、定期的なジョブ (ポーリングなど) を作成して、インターフェイスで新しいメッセージをチェックし続ける必要があります。Sidekiq は、無期限に実行されるジョブを実行するためのものではありません。

懸念事項 1 を解決する最も確実な方法は、デーモンを作成することです。やり過ぎのように思えるかもしれませんが、「デーモン」のような gem を使用すると、これは非常に簡単な作業になります。このデーモンはインターフェイスを監視し、関心のあるデータをある種のデータストア (MySQL、Redis など) にプッシュできます。

これらのバックグラウンド ソリューションのいずれかまたは両方を使用してこの問題を解決できますが、少なくとも最初の懸念事項を管理するには、別のプロセスが必要だと思います。これにより、懸念事項 3 (Web アプリケーション) は、データストアからのデータの読み取りとユーザーへのレンダリング、および特定の要求 (コマンド) をバックグラウンド ジョブに変換することのみを処理できます。これにより、Rails アプリの本来の機能を維持しながら、必要なことはすべて実行できます。

于 2013-04-11T04:12:50.720 に答える
0

Railsは(ほとんど)問題ありません。

Sidekiq または Resque は、Ivy のポーリングを行うのに適した方法です。新しいメッセージを定期的にポーリングするようにワーカーをスケジュールできます。

Rails 4 はライブ ストリーミングを行いますが、まだ本格的な時期には対応できていません。Node.js/Socket.io セットアップのようなものを使用して、WebSocket 経由でクライアント ブラウザーと通信することをお勧めします。または、高度なリアルタイム更新が必要なく、クライアントの数が少ない場合は、ワーカーに結果を DB にダンプさせ、ブラウザーに更新をポーリングさせます。

しかし、アイビーはこだわりポイントです。Ruby/Rails アプリから Ivy に話しかけることについては、あまり見かけません。おそらく、JRUby を使用してから、Java ラッパーの 1 つを使用できます。

あなたは Rails にあまり慣れていないので、Ivy の人々は既に Python や Perl で書かれたツールを持っているので、Python や Perl でこれを行う方がおそらく簡単でしょう。

于 2013-04-10T19:16:16.660 に答える