最近、Railsプロジェクトの1つで小さなチャットを実装する必要に直面しました。 この問題を解決するには、AJAXを使用したサーバーの定期的なポーリングから、サードパーティサービスの既製のソリューションの使用まで、多くの方法があります。 トラフィックとシステムの応答時間を最小限に抑えるために、WebSocket APIを使用することにしました。これは、サーバーがクライアント要求を待たずにデータ転送を開始できるHTML 5標準の一部の1つです。 残念ながら、WebSocket APIは、Google Chrome、Safari 5、iOS 4.2以降のMobile Safari、およびおそらくすべてを含む、かなり限られた数のブラウザーでサポートされています(間違っている場合は、コメントを修正してください)。 もちろん、これは戦闘アプリケーションには十分ではないため、WebSocket APIのネイティブサポートなしでブラウザーのフォールバックを提供する必要があります。 この場合、Flashソケットを使用するのが最も便利です。 WebSocket APIとFlash Socketsを使用して、アプリケーションは、デスクトップシステム(MS Windows、Linux、Mac OS X)とモバイル(Android、iOS)の両方を含む、考えられるほとんどのケースをカバーします。
理論から実践に移り、RailsアプリケーションでWebSocket APIを使用できるツールについて説明します。 いくつかの可能なオプションがありますが、その中で私は次のことに注意します。
- Juggernaut( http://juggernaut.rubyforge.org/ )は、元々Rubyで記述され、その後node.jsで書き直されたソリューションです。 Redisはデータストレージに使用され、Railsアプリケーションと緊密に統合するための宝石があります。 Juggernautは、WebSocket APIを実装およびエミュレートするためのかなり多数の方法を提供します。たとえば、WebSocketのネイティブサポートもFlashオブジェクトをロードする機能もブラウザーで利用できない場合、必要な機能は定期的なAJAXリクエストを使用してエミュレートされます。これにより、システムの応答時間が増加し、負荷が増加しますサーバーに、しかし彼らが言うように、魚なしと癌は魚なしです。 私の状況でのJuggernautの欠点は、サーバーにredisとnode.jsをインストールする必要があり、それでも我慢できますが、FFでFlashが動作しなかったバグは、Juggernautに代わるものを探しに行った最後のわらでした。
- pusher.comは、WebSockets APIのすべての作業を処理し、RESTインターフェイスを使用してクライアントにメッセージを送信できるサービスです。 pusher.comの強みは、スケーラビリティと、インターネットリソースとのユーザーインタラクションを分析できることです。 残念ながら、私の場合、外部サービスの使用は困難であったため、 pusher.comを放棄する必要がありました。
- Socky-server( https://github.com/socky/socky-server-ruby )は、 EM-WebSocketおよびEM-HTTP-Clientに基づくRubyサーバーであり、WebSockets APIおよびFlashフォールバックをサポートします。 Railsとの統合には、gem socky-client-railsが使用されます。 ルーム、承認、および特定のユーザーへのメッセージ送信のサポートがあります。 このソリューションで特に気に入ったのは(特にJuggernautの後)そのままで機能することです。Gemfileにいくつかの依存関係を記述し、バンドルインストールを実行し、構成を生成し、サーバーを起動すると、開発を開始できます。 socky-serverを使用した簡単なチャットの例はsockydemo.imanel.orgにあり、ソースコードはhttp://github.com/socky/socky-exampleにあります 。
まとめると、WebSockets APIを使用すると、Webアプリケーションの対話性を高めてリソースをより便利にすることができ、サーバーをわずかにロードするだけで、SockyサーバーはRailsアプリケーションでWebSockets APIを使用する作業を簡単で簡単にします。