2011-11-22 10 views
5

私は、Rails 3.1の簡単なチャットルームアプリケーションを学習目的で作成しています。 私はすべての必要なモデル(メッセージ、ユーザー、部屋など)を持っており、物事は素晴らしいです。 クライアントは毎分サーバーをポーリングし(たとえば)、新しいメッセージがあれば取​​得します。EventMachineを使用してRailsアプリケーションで長いポーリングが可能ですか?

シンプルポーリングをロングポーリングに変更したいのですが、これを同じアプリで行うことができないのか、ロングポーリング用に他のプッシュサーバーを作成する必要があるのか​​分かりません。

私はEventMachineについて多くのことを読んで、私はEventMachineをイベントドリブンメカニックスに使用したいと思っていたので、ユーザーにそれを変更しました。私はEventMachineチャンネルがこれに便利だと思いました。 クライアントは、チャットルームに接続してメッセージを待つことになり、メッセージがルームに送信されたときにのみメッセージを受信します。

私が理解できないことは、すべてのクライアント接続の間でEventMachine :: Channelインスタンスを共有する方法です。 このアプローチは可能ですか、それとも間違った方法ですか?

可能であれば、私はHerokuでホストされている1つのレールアプリケーションとして実行できるソリューションを希望します。

+0

私はイベントマシンの専門家ではありませんが、可能であると思います。また、クライアント間でチャネルを共有することはありませんが、クライアントごとに1つのチャネルがあり、異なるユーザー間でメッセージを送信するにはEMの上に何かを構築する必要があります。 – Augusto

+0

はい、すべてのクライアントにチャンネルがあります。 他の誰かがメッセージを送信したときに呼び出されるコントローラからアクセスできるように、これらのすべてのチャネルインスタンスをどこに保存できますか? – Oded

答えて

0

私がコメントに言及したものを拡大し、EMを使用して、テキストベースのチャットアプリケーションを作成する方法について説明し、他のユーザーにメッセージをブロードキャストするAMQPを使用して、このblogポストを確認してください。

私はあなたがおそらく同じメッセージを共有するためにメモリキュー内でいくつかを使うことができると思います。これは、RabbitMQのような外部サービスへの依存がないので、herokuでは間違いなく動作するはずです。 はここで別のキューフレームワークについての良い議論だ:ActiveMQ or RabbitMQ or ZeroMQ or

0

Railsは、今、あなたはバックエンドとしてシナトラとのRedisのパブ/サブ機能でthisの例のように(ロングポーリング)をストリーミングできるため、バージョン4. に追加ストリーミングしているだろう。ユーザーが送信したメッセージを処理する別のアクションを追加して、PUBLISHコマンドでRedisのメッセージに追加する必要があります。 ThinやPumaのようなイベントを起こしたサーバを使うべきです。

1

はい。イベントマシンを使ってデモを書きました。私の場合は、そのプレーヤーが地図を歩き回っていて、他のプレイヤーがそれを見ることができるはずです。 デモは、そのようになります。

  1. クライアントが接続を確立し、報告独自の座標

  2. 各クライアント

  3. のすべての座標を保存する配列がある(ランダムに生成)クライアントが移動すると、新しい座標がサーバーに送信されます。次に、サーバは彼(アレイから)の近くの人を見つけ出し、新しい座標をそれらのクライアントにプッシュします。

私はそれを5000人近くのクライアントでテストし、2人目の20-30人のプレイヤーがそれぞれの位置を変えました。そして、サーバープロセスは、その100M未満のメモリしか消費しません。& 50%-60%のCPU使用率(単一コア上)。

あなたの場合、おそらくあなたもフェイを試してくださいと思う。それは、イベントマシンとチャットルームのようなものに適切なソリューションに基づいています。

関連する問題