技術分類マップ
リアルタイム通信を実現する様々な技術の分類と特徴を理解しましょう。
リアルタイム通信を実現する様々な技術の分類と特徴を理解しましょう。
動作の仕組み
クライアントが定期的(例:5秒ごと)にサーバーへHTTPリクエストを送信し、新しいデータがあるか確認します。
サーバーは各リクエストに対して即座に応答を返し、データ更新の有無に関わらず接続は都度切断されます。
// 典型的なポーリング実装
setInterval(async () => {
const response = await fetch('/api/status');
const data = await response.json();
updateUI(data);
}, 30000); // 30秒間隔
最適な使用場面:
制限事項:
動作の仕組み
クライアントがEventSourceで接続を開始すると、サーバーはtext/event-stream
形式で接続を維持します。
サーバーは任意のタイミングでデータをプッシュ配信でき、クライアントは受信専用で、送信には別のHTTPリクエストが必要です。
// クライアント側
const eventSource = new EventSource('/api/stream');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
updateDashboard(data);
};
// サーバー側 (Node.js例)
app.get('/api/stream', (req, res) => {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
setInterval(() => {
res.write(`data: ${JSON.stringify(getCurrentData())}\n\n`);
}, 1000);
});
最適な使用場面:
制限事項:
動作の仕組み
HTTPハンドシェイクで接続を確立後、プロトコルをWebSocketに切り替えて双方向の持続的接続を維持します。
クライアント・サーバー双方から任意のタイミングでメッセージを送信でき、最小限のフレームヘッダーで低遅延通信を実現します。
// クライアント側
const ws = new WebSocket('wss://example.com/ws');
ws.onopen = () => console.log('接続確立');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
handleRealtimeUpdate(data);
};
// 双方向通信
ws.send(JSON.stringify({ type: 'chat', message: 'Hello!' }));
// サーバー側 (Node.js + ws)
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws) => {
ws.on('message', (data) => {
// 全クライアントにブロードキャスト
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(data);
}
});
});
});
最適な使用場面:
制限事項:
動作の仕組み
シグナリングサーバーを介して接続情報を交換後、クライアント同士が直接P2P接続を確立します。
NATトラバーサル技術(STUN/TURN)を使用してファイアウォールを越え、音声・ビデオ・データを直接やり取りします。
// WebRTC Data Channel
const peerConnection = new RTCPeerConnection();
const dataChannel = peerConnection.createDataChannel('chat');
dataChannel.onopen = () => {
dataChannel.send('Hello P2P!');
};
dataChannel.onmessage = (event) => {
console.log('受信:', event.data);
};
最適な使用場面:
制限事項:
動作の仕組み
GraphQLスキーマでサブスクリプション型を定義し、WebSocketやSSE上でリアルタイムデータを配信します。
クライアントは購読したいデータのクエリを送信し、サーバーは条件に合致するデータ更新があるたびに、型安全な形式でプッシュ配信します。
最適な使用場面:
動作の仕組み
HTTP/2の多重化接続を利用し、クライアントがリクエストする前にサーバーが先行してリソースをプッシュ送信します。
単一のTCP接続上で複数のストリームを並行処理し、ヘッダー圧縮により効率的な通信を実現します。
最適な使用場面:
動作の仕組み
HTTP/2上でProtocol Buffersを使用した効率的なRPC通信を実現し、4種類のストリーミングパターンをサポートします。
単方向・双方向のストリーミングが可能で、バイナリ形式により高速なシリアライズ・デシリアライズを実現します。
最適な使用場面:
技術 | 遅延 | スループット | サーバー負荷 | 実装コスト | スケーラビリティ |
---|---|---|---|---|---|
HTTP ポーリング | 高 | 低 | 高 | 低 | 低 |
ロングポーリング | 中 | 中 | 中 | 中 | 中 |
SSE | 低 | 高 | 低 | 中 | 高 |
WebSocket | 最低 | 最高 | 最低 | 中 | 高 |
WebRTC | 最低 | 最高 | なし | 高 | 高 |
技術 | 双方向通信 | バイナリ対応 | 自動再接続 | ブラウザ対応 | プロキシ通過 |
---|---|---|---|---|---|
HTTP ポーリング | △ | ○ | ○ | ○ | ○ |
SSE | △ | △ | ○ | ○ | ○ |
WebSocket | ○ | ○ | △ | ○ | ○ |
WebRTC | ○ | ○ | △ | ○ | △ |
プロジェクト要件に基づく技術選択の決定フローです。
スケーラビリティの考え方
同時接続数は技術選択の最も重要な指標の一つです。
ポーリングは接続数が増えるとサーバー負荷が急激に上昇し、WebSocketは持続的接続により効率的に多数のクライアントを扱えます。
同時接続数による技術選択:
- < 100接続: どの技術でも問題なし
- 100-1,000: ポーリング避ける、SSE/WebSocket推奨
- 1,000-10,000: WebSocket + 負荷分散
- 10,000+: WebSocket + マイクロサービス + クラスタリング
セキュリティと運用の考慮点
WebSocketはHTTPと異なるセキュリティモデルを持ち、認証・認可の実装に工夫が必要です。
運用面では、HTTP系技術の方が既存ツールやノウハウが豊富で、障害対応やデバッグが容易です。
要件:
技術選択: WebSocket
// 理由:
// 1. 双方向リアルタイム通信が必須
// 2. 高い同時接続数に対応
// 3. モバイルでのバッテリー効率
要件:
技術選択: Server-Sent Events
// 理由:
// 1. 一方向通信で十分
// 2. 自動再接続機能
// 3. 実装・運用が簡単
要件:
技術選択: WebRTC + WebSocket
// 理由:
// 1. WebRTC: メディアストリーミング
// 2. WebSocket: シグナリング制御
// 3. 組み合わせによる最適化
// WebSocketとWebAssemblyの組み合わせ
const wasmModule = await WebAssembly.instantiateStreaming(
fetch('websocket-handler.wasm')
);
const ws = new WebSocket('wss://example.com');
ws.onmessage = (event) => {
// WebAssemblyで高速処理
const result = wasmModule.instance.exports.processMessage(event.data);
updateUI(result);
};
今後の技術選択戦略
WebSocketは成熟した技術として安定しており、当面はリアルタイム通信の中心的役割を担い続けるでしょう。
HTTP/3やWebTransportの普及を見据えつつ、柔軟なアーキテクチャ設計が重要です。
WebSocketは「リアルタイム双方向通信のデファクトスタンダード」
として位置づけ、他技術は特定用途での選択肢として考慮する
次のPhaseでは、実際にWebSocketを実装する際の具体的な技術と ベストプラクティスを学習していきます!
このレッスンの内容を理解できましたら、完了マークをつけて次のレッスンに進みましょう。