技術分類マップ
リアルタイム通信を実現する様々な技術の分類と特徴を理解しましょう。
図表を生成中...
リアルタイム通信を実現する様々な技術の分類と特徴を理解しましょう。
// 典型的なポーリング実装
setInterval(async () => {
const response = await fetch('/api/status');
const data = await response.json();
updateUI(data);
}, 30000); // 30秒間隔
最適な使用場面:
制限事項:
// クライアント側
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);
});
最適な使用場面:
制限事項:
// クライアント側
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);
}
});
});
});
最適な使用場面:
制限事項:
// 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);
};
最適な使用場面:
制限事項:
技術 | 遅延 | スループット | サーバー負荷 | 実装コスト | スケーラビリティ |
---|---|---|---|---|---|
HTTP ポーリング | 高 | 低 | 高 | 低 | 低 |
ロングポーリング | 中 | 中 | 中 | 中 | 中 |
SSE | 低 | 高 | 低 | 中 | 高 |
WebSocket | 最低 | 最高 | 最低 | 中 | 高 |
WebRTC | 最低 | 最高 | なし | 高 | 高 |
技術 | 双方向通信 | バイナリ対応 | 自動再接続 | ブラウザ対応 | プロキシ通過 |
---|---|---|---|---|---|
HTTP ポーリング | △ | ○ | ○ | ○ | ○ |
SSE | △ | △ | ○ | ○ | ○ |
WebSocket | ○ | ○ | △ | ○ | ○ |
WebRTC | ○ | ○ | △ | ○ | △ |
プロジェクト要件に基づく技術選択の決定フローです。
同時接続数による技術選択:
- < 100接続: どの技術でも問題なし
- 100-1,000: ポーリング避ける、SSE/WebSocket推奨
- 1,000-10,000: WebSocket + 負荷分散
- 10,000+: WebSocket + マイクロサービス + クラスタリング
要件:
技術選択: 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は「リアルタイム双方向通信のデファクトスタンダード」
として位置づけ、他技術は特定用途での選択肢として考慮する
次のPhaseでは、実際にWebSocketを実装する際の具体的な技術と ベストプラクティスを学習していきます!
このレッスンの内容を理解できましたら、完了マークをつけて次のレッスンに進みましょう。