【要約】WebSocket入門 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者がリアルタイムな双方向通信を実現しようとする際、従来の通信プロトコルの制約や非同期処理の扱いに直面する。具体的には以下の問題が発生する。
- ・HTTP通信の制約:リクエスト/レスポンス型では、サーバからクライアントへの即時通知が困難である。
- ・通信のブロッキング:送信と受信を直列に処理すると、リアルタイムなデータ受信が妨げられる。
- ・イベントループの停止:同期的な待機処理(time.sleep)を使用すると、接続維持などの内部処理が停止する。
// Approach
FastAPIとasyncioを組み合わせ、非同期なイベントループを活用して低遅延な双方向通信を実現するアプローチを採用する。具体的な手法は以下の通りである。
- ・サーバ実装:FastAPIの
websocketデコレータを用い、websocket.accept()で接続を確立する。 - ・非同期処理の活用:
asyncio.create_task()を用いて、HTTPリクエストとは独立した通信処理を行う。 - ・並行処理の実装:
asyncio.gather()等を用い、送信と受信の処理を非同期に並行実行する。 - ・接続管理:接続中のWebSocketオブジェクトをリストで保持し、全クライアントへのブロードキャストを行う。
// Result
開発者は、FastAPIを用いたWebSocketの最小構成から、複数クライアントへのブロードキャストまでを実装できる。適切な実装により、以下の成果が得られる。
- ・リアルタイム性の確保:送信と受信を分離することで、通信のブロッキングを回避できる。
- ・安定した接続維持:
asyncio.sleep()の使用により、イベントループを停止させずに待機できる。 - ・機能拡張の基盤:切断時の
WebSocketDisconnect処理を含め、実用的な通信フローを習得できる。
Senior Engineer Insight
> 基礎習得には有用だが、大規模運用には設計の再考が必要だ。単一サーバのメモリ上での接続管理は、スケーリング時に限界を迎える。複数ノードにまたがる通信には、Redis Pub/Sub等の外部メッセージブローカーの導入が不可欠である。また、ネットワークの瞬断に対する再接続ロジックの実装も、実戦投入時には必須となる。