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 / 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 との使い分け

SSE / WebSocket API との使い分けを以下に整理する。

手法用途GraphQL 統合
GraphQL SubscriptionGraphQL API のリアルタイム拡張ネイティブ
WebSocket API (API Gateway)カスタムプロトコル、チャット手動実装
SSE一方向のプッシュ通知手動実装

GraphQL を既に使っているプロジェクトでは、Subscription が最も自然な選択だ。

スケーリングの課題

Subscription は WebSocket の永続接続を維持するため、接続数に応じてサーバーリソースが必要になる。AppSync はマネージドで接続管理を行うため、スケーリングの心配が不要だ。

GraphQL Subscription の関連書籍も参考になる。

この記事は役に立ちましたか?

関連用語

関連する記事