【ぐらふきゅーえるさぶすくりぷしょん】

GraphQL Subscription とは?

最終更新:
💡 イベントごとに、選んだデータを受け取る

GraphQLの継続的な操作。サーバーのイベントを受け、選択したフィールドの結果を応答ストリームとして返します。WebSocketに限定されず、再接続や再送の保証は利用する実装で設計します。

📌 このページのポイント
Subscription:イベントから応答を届けるイベント元部屋の新着メッセージフィールド実行sender / text等を取得応答を届ける応答ストリームとして配信イベント元をアプリが用意するWebSocket / SSEなど、通信方式をそろえる仕様だけで再送・取りこぼしゼロは保証しない解除・資源の片付けも設計する
特定の部屋の新着メッセージから選択したデータを取得し、応答を届ける流れです。イベント元・通信方式・配信の保証は実装側で用意します。
ひよこ ひよこ
SubscriptionはQueryとどう違う?
ペンギン先生 ペンギン先生
Queryは1回の実行結果を返す操作。Subscriptionはイベントの列を受けて、各イベントから選んだフィールドを実行し、応答の列を返す操作だよ。たとえばチャットの新着メッセージを購読する。データベースのすべての変更を自動で監視する仕組みではないんだ。
ひよこ ひよこ
スキーマを書けば配信される?
ペンギン先生 ペンギン先生
宣言だけでは足りないよ。サーバーでイベント元を用意し、購読の条件や利用者の権限と結び付ける必要がある。subscription NewMessages { newMessage(roomId: 123) { sender text } }なら、サーバーがその部屋の新着を発行する実装が必要だね。
ひよこ ひよこ
WebSocketが必須?
ペンギン先生 ペンギン先生
必須ではないよ。GraphQL仕様は通信方式を指定しない。graphql-wsなどのWebSocket実装や、graphql-sseのようなSSE実装がある。クライアントとサーバーで同じ通信方式・プロトコルに対応していることを確認するんだ。
ひよこ ひよこ
graphql-wsがプロトコル名?
ペンギン先生 ペンギン先生
ライブラリ名と通信上の名前を区別しよう。graphql-wsが使うWebSocketのサブプロトコル名はgraphql-transport-ws。似た名前の実装でも互換とは限らないので、接続時に合意する名前とメッセージ形式を合わせるんだ。
ひよこ ひよこ
切断中のイベントも届く?
ペンギン先生 ペンギン先生
GraphQL仕様は確認応答、バッファ、再送などを保証していない。再接続、イベントID、履歴からの補完、重複の扱いを必要に応じて実装する。イベント元や複数サーバー間の共有も、Pub/Subを使うかなどアプリで選ぶよ。
ひよこ ひよこ
購読のフィールドはいくつでもよい?
ペンギン先生 ペンギン先生
1つの購読操作のルートフィールドは1つだよ。その中で複数の下位フィールドを選べる。不要になったら解除し、サーバー側の資源も片付ける。接続が長く続くから、認証期限や権限変更時の扱いも設計しよう。
もっと詳しく知りたい人へ

リアルタイムなら遅延や取りこぼしはゼロ?

その保証ではありません。イベントの発行、検索・実行、ネットワーク、クライアントの処理で遅延が生じます。必要な鮮度と再送・重複・欠落の扱いを決め、切断や障害を含めて確認してください。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「GraphQL Subscription」って出てきたら「イベントから継続的に応答を作る操作」と思えばだいたいOK!
📖 おまけ:英語の意味
「GraphQL Subscription」 = GraphQLの購読操作
💬 イベントを継続的に受け取る操作です。GraphQLの実行の仕組みと、WebSocketやSSEなどの配信方法を分けて理解します。

参考資料

← 用語集にもどる