GraphQLサブスクリプションをステップごとに解説

GraphQLサブスクリプション

GraphQLサブスクリプション:通信レベルでの仕組み | We.Inc

GraphQLサブスクリプションとは何か、ルートフィールド1つのルール、graphql-wsのメッセージの流れ、SSEという選択肢、ポーリングのほうが適している場面を解説します。

GraphQLサブスクリプションは長時間続く操作です。クライアントがサブスクリプションのドキュメントを一度送ると、該当するイベントが発生するたびにサーバーが新しい結果をプッシュします。GraphQLはトランスポートを規定していません。実際にはgraphql-wsプロトコルを使ったWebSocket上か、Server-Sent Events上で動作します。各サブスクリプション操作では、ルートフィールドをちょうど1つだけ選択する必要があります。

サブスクリプション、ポーリング、再取得の比較

下のステッパーは、graphql-wsプロトコル上の1つのサブスクリプションをメッセージごとに再生します。最初のハンドシェイクから最後のcompleteまで、各ステップでソケットを流れるJSONフレームと、それを送る側を表示します。

よくある質問

なぜサブスクリプションごとにルートフィールドは1つだけなのですか?

各サブスクリプションは1つのイベントストリームに対応するからです。graphql.orgでは、1つのサブスクリプション操作に2つのルートフィールドを入れると無効になると示されています。代わりに名前付きのサブスクリプションを2つ書きましょう。

graphql-wsはどのWebSocketサブプロトコルを使いますか?

ハンドシェイク時にgraphql-transport-wsをネゴシエートし、connection_init、subscribe、next、completeなどのフレームタイプを使います。他のGraphQL WebSocketライブラリは別のプロトコルを使う場合があるため、ほかのデバッグを始める前に、クライアントとサーバーのプロトコルが一致しているか確認しましょう。

WebSocketなしでサブスクリプションを使えますか?

使えます。graphql-sseプロトコルは、各結果をnextという名前のServer-Sent Eventとして送り、completeで終了します。通常のHTTP上で動くため、WebSocketのアップグレードをブロックするプロキシの背後でも役立ちます。

サブスクリプションはクエリと同じようにスケールしますか?

しません。graphql.orgが指摘するとおり、購読中の各クライアントは1つのサーバーインスタンスに結び付き、接続中ずっと状態を保持する必要があります。そのため、サーバー間でイベントを配信するpub/subシステムも必要になります。

サブスクライブすると何が起こるか

graphql-wsプロトコルの概要

ポーリングのほうが適している場合

スキーマとクライアントのコード

サブスクリプションフィールドを宣言する

SubscriptionはQueryやMutationと同じルート型です。各フィールドが、クライアントが開ける1つのストリームになります。

graphql-wsクライアントでサブスクライブする

createClientはソケットを必要になったときに開き、iterateはイベントごとに1つの結果を返す非同期イテレーターを返します。

ルートフィールド1つのルール

2つのストリームを2つの操作に分ける

reviewCreatedと別のルートフィールドを並べた1つのサブスクリプションは検証に失敗します。名前付きの操作を2つにすれば動作します。

クライアントがconnection_initを送信

ソケットが開いた直後に送られます。ペイロードの形式は自由で、サーバーはそこからトークンを読み取ることがよくあります。

サーバーがconnection_ackを送信

サーバーが接続を受け入れました。これより前にsubscribeフレームを送ると、ソケットは4401 Unauthorizedで閉じられます。

クライアントがsubscribeを送信

idはクライアントが決め、実行中の操作の中で一意でなければなりません。ペイロードは通常のクエリと変数です。

サーバーがnextを送信

レビューが投稿されたので、サーバーは選択セットを実行し、同じidで結果を送りました。

サーバーが再びnextを送信

イベントがあるたびに新しいフレームが届きます。サブスクリプションが開いている限り、これが繰り返されます。

クライアントがcompleteを送信

ユーザーがページを離れたので、クライアントは操作を停止します。ソケットは他のサブスクリプションのために開いたままにできます。

1つのサブスクリプションをフレームごとに

戻る

次へ

最初から

ステップ {n} / {v}

ソケット上のフレーム

フレームをコピー

すべてのステップ

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る