ここでの主な問題は、「単なる」キューである Resque を曲げようとするのではなく、メッセージング (IM ではなく IPC のようなもの) のための別のソリューションが必要であることだと思います。一部のオプションにはamqp gem (AMQP プロトコル) またはzmq gem (ZeroMQ プロトコル) がありますが、Ruby 標準ライブラリ Socket クラス (良い例) を介してプレーンな古い UNIX ソケットを使用することもできます。それぞれに長所と短所がありますので、あなたとあなたのニーズ次第です。
相互作用は次のようになります。
- ボットが起動します。
- ボットが IPC メッセージのリッスンを開始します。
- ボットは送信者から (XMPP 経由で) クエリを受信します。
- ボットは Resque を介してジョブをキューに入れます。
- ジョブは HTTP 経由で Rails アプリを呼び出します。
- Rails アプリは、その役割分担を行います。
- 誰かまたは何かがクエリを解決し、Rails アプリを介して結果を入力します。
- Rails アプリは、何らかの IPC メソッドを使用して結果をボットに送信します。
- ボットは結果を元の送信者に送信します (XMPP 経由)。
いつものように多少の変更があるかもしれません。たとえば、Resque はまったく必要ないと思います。ボットは、リクエストをただちに Rails アプリに渡すことができます。ただし、負荷、達成したい応答時間、現在のアーキテクチャなどによって異なります。おそらく、Resque ジョブは Rails アプリが結果を返すのを待ってから、ジョブ (Rails アプリではない) が IPC を使用します。他にもバリエーションがあります…</p>
ボットを開始/停止/リロードするには、rake タスクを作成する必要がありますか?
いいえ、あなたはしません。いつ、どのように実行するかはあなた次第です。結局のところ、Rake は、複数の Ruby スクリプトをまとめてそれらの間に依存関係を作成するための便利な方法と見なすことができます。ボットを実行するだけでなく、他のタスク (クリーンアップ、デプロイなど) があると思われる場合は、利便性のために Rake を使用することをお勧めします。まだ行っていない場合は、ボットのロジックをクラスにリファクタリングし、Rake タスクを使用して初期化します。ただし、そのままにして、スクリプトをそのまま実行しても問題ありません (monit、カスタム init.d スクリプト、アドホックなどを使用)。
rake なしで実行した場合 (おそらく Monit によって監視される独立したプロセスとして)、Resque とやり取りしたり、Rails モデルにアクセスしたりするにはどうすればよいですか?
レーキはこれに影響しません。Rake を介して Resque を実行し、Rake を介してボットを実行するか、スタンドアロン スクリプトとして実行するかは、OS の観点からは問題ではありません。とにかく、それらは異なるプロセスになります。また、Resque を実行するには Redis がどこかで実行されている必要があることに注意してください。
私はこれらが非常に些細な質問かもしれないことを知っています
いいえ、まったく。のような問題が些細なことと見なされるまでには、しばらく時間がかかると思います。