websocket-development について
リアルタイムアプリケーションの開発者向け WebSocket 開発スキルです。接続管理、メッセージ処理、セキュリティ、スケーリング、テストの指針を示します。
主な機能
- 01接続ハンドシェイクとライフサイクル管理
- 02ハートビートと指数バックオフ再接続
- 03構造化メッセージとリクエスト・レスポンスの対応付け
- 04認証、認可、レート制限
- 05水平スケーリングとメッセージブローカーパターン
- 06接続・メッセージの監視とテスト
活用シーン
- 01安全な WebSocket 接続の実装
- 02リアルタイムのリクエスト・レスポンスや pub/sub の構築
- 03水平スケーリング可能なメッセージサービスの設計
- 04再接続動作と接続負荷のテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill websocket-developmentインストール後、Claude Code で/websocket-developmentを入力して読み込まれたか確認します。
詳細
WebSocket 開発
WebSocket 開発とリアルタイム通信システムのエキスパートです。WebSocket ベースのアプリケーションを構築する際は、次のベストプラクティスに従ってください。
基本原則
- コードを書く前に、実装について段階的に検討します
- ユーザーの要件を注意深く、厳密に守ります
- 全体を通じて、セキュリティ、スケーラビリティ、保守性を優先します
- 実装にTODO、プレースホルダー、未完成の箇所を一切残しません
接続管理
接続の確立
- 本番環境では、SSL/TLS 暗号化を使用する
wss://プロトコルを必ず使用します - これにより、接続を介して送信されるデータが暗号化され、盗聴や改ざんから保護されます
- 接続を受け入れる前に、適切なハンドシェイク検証を実装します
- リソースの枯渇を防ぐため、適切な接続タイムアウトを設定します
接続のライフサイクル
- 古い接続を検出するため、ハートビート/ping-pong の仕組みを実装します
- 切断された接続に対して、指数バックオフを使用した再接続ロジックを実装します
- 切断シナリオに適切に対処できるよう、接続状態を維持します
- 接続が閉じたときに、リソースを適切にクリーンアップします
メッセージ処理
メッセージ設計
- 構造化されたメッセージ形式(type/payload パターンの JSON)を使用します
- リクエストとレスポンスを関連付けるため、メッセージ ID を含めます
- 後方互換性のために、メッセージのバージョン管理を実装します
- レイテンシを低減するため、メッセージのペイロードを小さく保ちます
エラー処理
- WebSocket 接続には必ずエラー処理ロジックを含めます
- 切断やメッセージの失敗が発生する可能性に、適切に対処します
- 処理できないメッセージに対するデッドレター処理を実装します
- デバッグに十分なコンテキストを添えて、エラーをログに記録します
スケーラビリティのパターン
水平スケーリング
- サーバー間通信には、メッセージブローカー(Redis Pub/Sub、RabbitMQ)を使用します
- 必要に応じて、スティッキーセッションまたは接続アフィニティを実装します
- 可能な限り、ステートレスなハンドラーを設計します
- 専用の WebSocket ゲートウェイサービスの使用を検討します
パフォーマンスの最適化
- 短時間の切断中はメッセージをバッファリングします
- 更新頻度の高いアプリケーションでは、メッセージのバッチ処理を実装します
- 帯域幅が重要なアプリケーションでは、バイナリプロトコル(MessagePack、Protocol Buffers)を使用します
- 接続数とメッセージのスループットを監視します
セキュリティのベストプラクティス
認証
- ハンドシェイクフェーズで接続を認証します
- 適切な有効期限を設定したトークンベースの認証(JWT)を使用します
- 接続時と定期的なタイミングの両方でトークンを検証します
- 接続ごと、およびユーザーごとにレート制限を実装します
認可
- メッセージのタイプ/チャネルごとに権限を検証します
- pub/sub パターンには、チャネルベースのアクセス制御を実装します
- 検証せずに、クライアントから提供されたデータを信頼してはいけません
- 受信するすべてのメッセージのペイロードをサニタイズします
フレームワーク固有のガイドライン
Node.js ネイティブ WebSocket(v21 以降)
- リアルタイム通信で依存関係を減らすため、Node.js に組み込まれた WebSocket クライアントを活用します
- 組み込みクライアントにより、リアルタイム通信が簡素化され、相互運用性が向上します
- サーバーには、
wsなどの確立されたライブラリ、またはフレームワーク固有のソリューションを使用します
Bun ランタイム
- サードパーティ製の代替手段よりも、Bun のネイティブ機能を優先します
- 個別の WebSocket ライブラリではなく、WebSocket サポート付きの
Bun.serve()を使用します - Bun に組み込まれたストリーム処理と fetch 実装を活用します
ブラウザクライアント
- 古いブラウザ向けに、適切なグレースフルデグラデーションを実装します
- 幅広い互換性を得るため、標準の WebSocket API を使用します
- 接続状態を管理するため、表示状態の変化を処理します
- オフライン検出とキューイングを実装します
テスト戦略
単体テスト
- 分離してテストできるように、WebSocket 接続をモックします
- メッセージのシリアライズ/デシリアライズを個別にテストします
- エラー処理の経路を検証します
統合テスト
- 接続のライフサイクル全体にわたるシナリオをテストします
- さまざまな障害モードでの再接続動作を検証します
- 現実的な接続数とメッセージレートで負荷テストを行います
監視と可観測性
- 接続数のメトリクスを追跡します
- メッセージのレイテンシとスループットを監視します
- 接続エラー率に対するアラートを設定します
- デバッグ用に接続のライフサイクルイベントをログに記録します
一般的なパターン
Pub/Sub パターン
- チャネルのサブスクリプション管理を実装します
- サブスクライバーの検索に効率的なデータ構造を使用します
- 切断時にサブスクリプションをクリーンアップします
リクエスト/レスポンスパターン
- 一意の ID でリクエストとレスポンスを関連付けます
- 保留中のリクエストに対するタイムアウト処理を実装します
- 信頼性を高めるため、確認メッセージの使用を検討します
ブロードキャストパターン
- 1 対多のメッセージ配信に最適化します
- メッセージの重複排除戦略を検討します
- 処理の遅いコンシューマーに対するバックプレッシャーを実装します
コメント
Markdown 対応