Webアプリケーションでの双方向の非同期データ交換

現代のWebの主な機能の1つは、専門家によるRIAと呼ばれます。これは、Webアプリケーションが機能的にデスクトップアプリケーションに近い場合の傾向を表します。 それにもかかわらず、この近似はかなり意的です。 強化されたWebアプリケーションの大部分は、依然として要求/応答モデルに基づいています。 つまり クライアント側のイベントはサーバー側に反映できますが、その逆はできません。 チャットのような平凡なことを実現するには、洗練されたトリックに頼らなければなりません。 DojoのAlex Russellのおかげで、この手法にはCometという名前さえあります。



cometdaily.comによると、クライアントとサーバー間の双方向のデータ交換をエミュレートするためのソリューションがいくつかあります。



さらに、FlashオブジェクトまたはJavaアプレットを使用できます。 そして、写真を完成させるために、Forever GIFのような古代のテクニックに言及することができます。



私からは、いくつかの高レベルのソリューションを追加します。





ネイティブソリューションを使用する場合、これらのアプローチのいずれかが多かれ少なかれハックであることに注意してください。 HTML5ワーキンググループのメンバーは明らかにこの状況をよく理解しているため、Web Socketsなどの標準が標準に導入されています。 その説明は万能薬のように聞こえます:ファイアウォールとルーターに耐性があり、クロスドメイン通信を許可し、既存のHTTPロードバランサーと統合し、バイナリデータの交換を許可し、安全な接続で動作します。 これらすべてにより、Web Sockets APIは非常にシンプルです( habrahabr.ru/blogs/webdev/79038参照 )。



画像



Hooray、ありがとう、みんな無料ですか? しかし、違います。 現在、Web SocketsはChromeの開発バージョン( 4.0.249.0-www.chromium.org/getting-involved/dev-channelから)でのみサポートされており、Firefox 3.7でサポートが約束されています。 今何をする? 明らかに、回避策がない場合、Web Socketが存在する場合に「ネイティブ」APIを使用するクライアント側のファサードが必要です。 そのようなソリューションは、お金のためではなく、魂の親切のために配布された場合、Kaazing Websocket Gateway( kaazing.com/download )になります。 Web Socketsに加えて、amqp、imap、irc、ldap、smtp、ssh、stompへのアクセスが確実に必要な場合は、Orbited( orbited.org )をio.js( github.com/mcarter/js.io )と一緒に使用できます。通信をプロキシするサーバー上のtelnet、xmppおよびPython。 私の選択:WebSocket.js( github.com/gimite/web-socket-js )。 小さなJSライブラリとFlashオブジェクト形式のブリッジ。



これでWebSocketサーバーのみが必要になり、私たちの場合(バックエンドはJavaで記述されています)、Jettyはバージョン7.0.1からこれに最適です(現時点ではステータスはほぼ安定していますが、いつ怖がりましたか?)。 サーバーアプリケーションがphpで作成されている場合は、phpwebsocket( code.google.com/p/phpwebsocket )またはPhpwebsockets( code.google.com/p/phpwebsockets )を使用してみてください。 しかし、両方のソリューションは実験的であるため、ユーザー自身の危険とリスクがあります。

更新:phpDaemon habrahabr.ru/blogs/php/79377でのチャット実装例



Jettyをインストールしても問題は発生しませんが、Adobeのいわゆるクロスドメインポリシーにより、WebSocket.jsで問題が発生する可能性があります。 Flashオブジェクトがサーバー上のソケットを開くことを許可する必要があります。 最も信頼できるソリューションは、ポート843でマイクロサーバーをホストすることです 。これは、 www.lightsphere.com/dev/articles/flash_socket_policy.htmlで説明されているように、適切なXMLでポリシー要求に応答します。 この記事では、最もシンプルなXMLサーバーについても説明しています。 しかし、私はそれがあまり好きではなく、 devzone.zend.com/article/1086の例に基づいてソケットサーバーを作成しました。



Webソケットができたので、サーバーイベントに即座に応答できるWebアプリケーションを作成できます。 Facebookなどの通知システム(通知)、Google Waveスタイルのユーザーインタラクション用サービス、リアルタイムモニター(オンラインのユーザーなど)、または着信SMSやイベントなどのサードパーティのイベントソースとの統合が可能です。デスクトップアプリケーションで。 さまざまなソースからさまざまなクライアントに向けたさまざまなイベントが予想されるため、サーバー上に信頼できるメッセージフロー制御システムが必要です。 シンプルだがエレガントなSTOMPプロトコル( stomp.codehaus.org )があります。 APIには、STOMPクライアントとSTOMPブローカーが通信する少数のコマンド(SEND、SUBSCRIBE、UNSUBSCRIBE、BEGIN、COMMIT、ABORT、ACK、DISCONNECT)のみがあります。 特に、Zend Queue( framework.zend.com/manual/en/zend.queue.stomp.html )にはSTOMPアダプターがあります。 メッセージブローカーは、Apache ActiveMQ( activemq.apache.org )またはRabbitMQ( www.rabbitmq.com )に基づいて実装できます。



ただし、非常に深刻な場合は、より開発された柔軟な( habrahabr.ru/blogs/webdev/62502 )プロトコルAMQP( www.amqp.org )に注意する必要があります。



JBOSSコンテナであるJettyは、Webソケットを提供します。 AMQPアラートをWebソケットにブロードキャストするには、別のコンテナーを使用するだけです。 このためには、AMPQのブローカーの1つをインストールする必要があります。 ZeroMQ( www.zeromq.org )は最速と見なされます。 Qpid( qpid.apache.org/amqp-brokers.html )は非常に人気があり、Apacheプロジェクトから期待されています。



All Articles