Chat
Overview
チャットシステムの考え方やガイドラインをまとめるためのセクション。
チャットシステムの基本的な考え方
- クライアント同士は通信をしない。
チャットサービスは以下の機能をサポートする必要がある。
- 他のクライアントからのメッセージを受信する
- それぞれのメッセージに適した受信者を探し、受信者にメッセージをリレーする
- 受信者がオンラインでない場合、その受信者がオンラインになるまでその受信者向けのメッセージをサーバーに保持する
送信者(クライアント)
クライアントがチャットを始めようとすると、クライアントは1つ以上のネットワークプロトコルを使ってチャットサービスに接続する。
クライアントは、チャットサービスとのHTTP接続を開いてメッセージ送信し、受信者にメッセージを送信するようにサービスへ通知する。
keep-alive
ヘッダはクライアントとチャットサービスとの持続的な接続維持を可能にするため keep-alive
は効率的でありTCPハンドシェイクの数を減らす。
HTTPは送信側においては良い選択であり、Facebookなどはメッセージを送信するため最初にHTTPを使用している。
結果的にHTTPとしたが、WebSocketを使うのが一般的。
ヒント
チャットサービスにとって、ネットワークプロトコルは重要。
受信者
受信側は複雑。
HTTPはクライアント主導型であるため、サーバーからメッセージを送信することが簡単ではない。
長年にわたり、以下を検証された。
- ポーリング
- ロングポーリング
- WebSocket
サーバ主導の接続をエミュレートする多くの技術が使用されている。
ポーリング
ポーリングはクライアントがサーバに定期的に利用可能なメッセージがあるかを問い合わせる手法。
頻度によるがポーリングはコストがかかる。
ほとんどの場合、「いいえ」という答えるため貴重なサーバーのリソースを消費してしまうから。
ロングポーリング
ポーリングが非効率の可能性があるため、進化させたのがロングポーリング。
ロングポーリングはクライアントが実際に利用可能な新しいメッセージがあるか、またはタイムアウトの閾値に達するまで接続状態を維持する。