Androidでチャットアプリケーションを構築しています。 HTTP REST APIを使用して送信メッセージを送信することを検討しています。WebSocketまたはXMPPを使用する場合と比べて、そのアプローチが優れているか、またはデメリットがあるかを知りたいチャットメッセージの転送用)?
私が考えることができる長所/短所のいくつかは:
+ HTTPエンドポイントはサーバー側で水平方向に拡張するのが簡単です(これが主な関心事です)
+ Websocketsの学習曲線はHTTPに比べて急勾配です
-HTTPメッセージは、Webソケットと比較してペイロードが大きくなります
このドキュメントによると、FacebookでもAJAX=を使用してチャットメッセージを最初に処理したようです:
https://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf
チャットメッセージングにはREST APIを使用できますが、IMHO、XMPPがより良い代替手段です。XMPPが提供するものを検討してみましょう。
XMPPは、サポートのほかにTCPトランスポートはHTTPも提供します(pollingおよびbindingを介して)およびwebsocketトランスポート。読み取り HTTPおよびWebSocketトランスポートを介したXMPP
XMPPの観点から各トランスポートの長所と短所を理解することは興味深いでしょう。
XMPPは2つの方法でHTTPを使用できます:polling[18]およびbinding。
XMPP over HTTPポーリング
現在非推奨となっているポーリング方式は、サーバー側のデータベースに保存されたメッセージが、HTTPの「GET」および「POST」リクエストを介してXMPPクライアントによって定期的にフェッチ(およびポスト)されることを意味します。
XMPP over HTTPバインディング(BOSH)
バインディングメソッドは、他のHTTPポーリングテクニックよりも待ち時間と帯域幅の消費量を削減するため、ポーリングメソッドの通常のHTTP 'GET'および 'POST'リクエストよりも効率的です。
ただし、これにより、ソケットが長時間開いたままになり、クライアントの次のリクエストを待機するという欠点もあります。
同期HTTP([〜#〜] bosh [〜#〜])、[19]を介して双方向ストリームを使用して実装されたバインディング方法により、サーバーはすぐにクライアントにメッセージをプッシュできます彼らが送られるように。 このプッシュモデルの通知は、ポーリングよりも効率的です。ポーリングの多くは新しいデータを返しません。
BOSHテクニック がどのように機能するかを理解しているとよいでしょう。
「HTTPロングポーリング」と呼ばれることもある、BOSHで採用されている手法は、他のHTTPポーリング手法よりも待ち時間と帯域幅の消費を削減します。クライアントが要求を送信しても、接続マネージャーはすぐに応答を送信しません。代わりに、実際にクライアントに送信するデータがあるまで(または合意された長さの非アクティブ時間が経過するまで)、要求を開いたままにします。その後、クライアントはすぐに新しい要求を接続マネージャーに送信し、長いポーリングループを続行します。
接続マネージャーが、合意された一定の時間[12]の後にクライアントに送信するデータがない場合は、空の応答を送信します。これは、空白のキープアライブまたはXMPP Ping(XEP-0199)[13]と同様の目的を果たします。ソケット接続をアクティブに保ち、一部の仲介者(ファイアウォール、プロキシなど)が静かにドロップするのを防ぎ、妥当な時間内に中断を検出するのに役立ちます。
XMPP over WebSocketバインディング
XMPPは、より効率的なトランスポートであるWebSocketバインディングをサポートします
リアルタイムメッセージングのおそらくより効率的なトランスポートは、WebSocketです。これは、単一のTCP接続で双方向の全二重通信チャネルを提供するWebテクノロジーです。XMPPover WebSocketバインディングは、 IETFは標準RFC 7395を提案しました。
学習曲線といえば、はい、REST APIを使用したくなるかもしれませんが、今は学習するためのリソースがいくつかあります AndroidおよびXMPP 、および- XMPPサーバーソフトウェア インターネットまたはローカルエリアネットワーク上で独自のXMPPサービスを実行するために使用できます。アーキテクチャを決定する前に、この作業に費やす価値があります。
私はRESTアプローチがチャットで機能することができると思います。仮定しましょう:
私が正しく理解していれば、あなたの質問は最後の点についてです。
クライアントが http://chat.example.com/conversations/12 にoutboudメッセージを投稿すると、http接続が閉じられます。
欠点は、受信メッセージを受信できないことです。別のチャネルが必要になります(たぶん Googleクラウドメッセージング )。
逆に、WebSocketとXMPPは接続を維持するため、遅延なくメッセージを受信できます。しかし、これら両方の欠点は、実際、これがスケーラビリティの点でサーバーのコストを表すことです。バッテリー使用量に関するクライアントのコスト。
サーバー上:
クライアント上:
チャットまたは同様のリアルタイムアプリケーションでHTTP Rest APIを使用することはお勧めしません。
いくつかの概要。
チャットクライアントの要件
友達リスト取得
オンライン/オフラインの友達を確認する
ポイント1は、チャットクライアントを起動した後の1回限りのジョブなので、単純なレストコールで実行できるため、複雑なオーバーヘッドはありません。
残りのすべてのポイントは、p2pクライアントの場合もサーバーまたは他の部分からのデータの永続的なチェックが必要になります。新しいデータまたは別の更新を監視するために、長いまたは短いポーリングの残りの呼び出しを作成します。
HTTP Restクライアントの問題
キープアライブタイプの通信ではないため、オーバーヘッドが非常に大きくなり、過度に遅延する複数のhttp接続を行う必要があります。 HTTP呼び出しでは再接続に非常にコストがかかるため。
** WebソケットまたはXMPP **これらは通信の二重モードであり、インクリメンタルデータプッシュの処理に非常に優れており、新しいHTTP接続を再度作成しないため、本当にスムーズなパフォーマンスが得られます。
別の解決策残りのAPIモードを使用する必要があるレガシーシステムで立ち往生している場合。
CometDを試してみてください。これは、ほぼリアルタイムの通信を提供するwebsocketとajaxポーリングのハイブリッドアプローチであり、落下によってwebsocketをサポートしないクライアントで動作しますajaxポーリングメカニズムに戻ります。また、さまざまな最適化を使用して、何度も再接続することを回避しています。
また、Socket.ioを試すこともできます。これも、この種の使用例を解決する素晴らしいテクノロジーです
短い回答番号。
ステートレスプロトコルとして、HTTPに依存するライブの双方向通信を必要とする新しいプロジェクトを開始することはお勧めしません。接続が維持されていることは安心できますが、保証はありません。
君の + HTTP endpoint is easy to scale horizontally on server side
proは、HTTPが要求と応答のスタイルとして使用され、ステートレスと見なされる場合のプロです。本質的に接続を維持する必要がある場合、(完全ではありませんが)いくぶん意味のないものになります。
HTTPには、ここで触れていない次のような利点があります。
- HTTPは、他のポートがブロックされている可能性がある場合に、企業のファイアウォールプロキシを簡単に処理できます。
これは、他の人が述べたように、WebSocketsまたはXMPP over HTTPの成功率が高くなる場所です。
場合によります。あなたのアプリケーションは「ライブチャット」だと思いますか?プレゼンスインジケーターまたは入力インジケーターが必要ですか?これらの機能には、継続的な接続が必要です。ただし、「アプリ内メッセージング」が有効になっていると説明できるチャットアプリケーションの別のセットがあります。これらのアプリケーションは、ある種のバックエンドに会話と会話リストを保存します。別のデバイスにアプリをインストールしてログインするだけで、このタイプのアプリで会話が表示されます。これらのアプリには、プレゼンスインジケーターや活気感はありません。
私はXMPPでアプリケーションを実装していませんが、メッセージの永続性に関しては、XMPPで(箱から出して)見つけることができる最も永続性は、SMSと同様に、配信されるまで永続化されます。おそらく、スタンザが通過するときにスタンザをキャプチャし、独自のDBに格納することで、XMPPのストレージ/回復メカニズムを構築できます。しかし、完全な「チャット」エクスペリエンスが必要ない場合、データベース、HTTPサービス、およびプッシュ通知(更新されたスレッドを通知するため)を使用することは、メッセージング機能を備えたアプリの堅実な道のように思えます。これは、iOSおよびAndroid自分のアプリを今すぐ。
これに適したオープンソースのスキーマ/ APIデザインが見つかった場合はお知らせください。