ある企業が AWS 上でリアルタイムチャットアプリケーションを構築しています。ユーザーは WebSocket 接続でチャットルームに参加し、メッセージはリアルタイムで全参加者に配信される必要があります。接続ユーザー数は最大 100 万人が想定され、メッセージの永続化と 1 年間の履歴検索も必要です。サーバーレスアーキテクチャで実装したいと考えています。最も適切な設計はどれですか?
- A. EC2 インスタンスで Node.js の Socket.io サーバーを実行し、Redis Pub/Sub でスケールアウトする。RDS に履歴を保存する
- B. Amazon API Gateway WebSocket API でリアルタイム双方向通信を実装し、Lambda でメッセージを処理する。接続情報は DynamoDB に管理し、メッセージはルームメンバーの接続 ID に対して API Gateway の PostToConnection API で配信する。履歴は DynamoDB に保存し、Athena で検索可能にする
- C. AWS AppSync の GraphQL サブスクリプション機能でリアルタイム通信を実装し、DynamoDB をデータソースとする。1 年間の履歴は DynamoDB TTL で古いデータを S3 に移行して Athena で検索する
- D. Amazon Kinesis Data Streams でメッセージを受信し、Lambda でファンアウト配信を行う
解答と解説を見る
正解: B
API Gateway WebSocket API はサーバーレスのリアルタイム双方向通信を提供し、Lambda と統合することでインフラ管理不要でスケールします。接続 ID を DynamoDB に管理し、PostToConnection API でルームの全メンバーにメッセージをプッシュできます。DynamoDB は 100 万接続の状態管理に適しており、Athena との組み合わせで大量の履歴データの検索も可能です。 A: EC2 + Socket.io は機能しますが、サーバーレスではなくインフラ管理が必要です。100 万ユーザーへのスケールにはクラスター管理の複雑性が増します。 C: AWS AppSync は有効な選択肢ですが、DynamoDB の TTL でデータを S3 に移行する機能は標準では提供されておらず(TTL は削除のみ)、追加の実装が必要です。また 1 年分の履歴を DynamoDB に保持するとコストが高くなります。 D: Kinesis は高スループットのデータ処理に向いていますが、WebSocket の接続管理(接続確立・切断の追跡)や特定ユーザーへのプッシュ配信には API Gateway WebSocket API の方が適しています。
📚 関連サービスの解説: Amazon API Gateway ・ AWS Lambda