GraphQL Subscription
GraphQL でサーバーからクライアントへリアルタイムデータ更新を配信する仕組み
APIリアルタイム
GraphQL Subscription とは
GraphQL Subscription は、GraphQL の 3 つの操作タイプ (Query, Mutation, Subscription) の 1 つで、サーバーからクライアントへリアルタイムにデータ更新を配信する仕組みである。WebSocket 上で動作し、チャット、通知、ダッシュボードのリアルタイム更新に使われる。
基本的な使い方
# スキーマ定義
type Subscription {
orderStatusChanged(orderId: ID!): Order!
newMessage(channelId: ID!): Message!
}
# クライアントからのサブスクリプション
subscription OnOrderStatusChanged($orderId: ID!) {
orderStatusChanged(orderId: $orderId) {
id
status
updatedAt
}
}
Query / Mutation との違い
| 操作 | 方向 | プロトコル | 用途 |
|---|---|---|---|
| Query | クライアント → サーバー | HTTP | データの取得 |
| Mutation | クライアント → サーバー | HTTP | データの変更 |
| Subscription | サーバー → クライアント | WebSocket | リアルタイム更新 |
AWS AppSync での実装
AppSync は GraphQL Subscription をマネージドでサポートする。WebSocket の接続管理が不要で、Mutation をトリガーに自動的にサブスクライバーに配信する。
# AppSync: Mutation が実行されると、自動的に Subscription に配信
type Mutation {
updateOrderStatus(orderId: ID!, status: String!): Order!
}
type Subscription {
onUpdateOrderStatus(orderId: ID!): Order
@aws_subscribe(mutations: ["updateOrderStatus"])
}
クライアントが onUpdateOrderStatus をサブスクライブしている状態で、別のクライアントが updateOrderStatus Mutation を実行すると、サブスクライバーに自動的に更新が配信される。
SSE / WebSocket API との使い分け
| 手法 | 用途 | GraphQL 統合 |
|---|---|---|
| GraphQL Subscription | GraphQL API のリアルタイム拡張 | ネイティブ |
| WebSocket API (API Gateway) | カスタムプロトコル、チャット | 手動実装 |
| SSE | 一方向のプッシュ通知 | 手動実装 |
GraphQL を既に使っているプロジェクトでは、Subscription が最も自然な選択だ。
スケーリングの課題
Subscription は WebSocket の永続接続を維持するため、接続数に応じてサーバーリソースが必要になる。AppSync はマネージドで接続管理を行うため、スケーリングの心配が不要だ。
GraphQL Subscription の関連書籍も参考になる。