Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraphQL Federation ルータを本番稼働中に置き換える

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for ikawaha ikawaha
September 18, 2026
120

GraphQL Federation ルータを本番稼働中に置き換える

Avatar for ikawaha

ikawaha

September 18, 2026

Transcript

  1. GraphQL 効率的なデータ取得  クライアント 必要なデータ構造をクエリとして 定義し、一度のリクエストで取得 します。 query { user(id:

    "1") { name email } }  GraphQL { "data": { "user": { "name": "Alice", "email": "[email protected]" } } } サーバー データベース等からデータを取得 し、要求された項目のみを返却し ます。
  2. GraphQL Federation とは? User Service User info & Profiles 

    Product Service クライアント su Catalog & Inventory 必要なデータ構造をクエリとして定義し、 一度のリクエストで取得します。 Federation Gateway query { user(id: "1") { name email reviews { body } } } クエリを分解し、適切なサブグラフ へ並行して問い合わせます。 Review Service Ratings & Comments subgraph
  3. Gatewayの役割1 : Composition (スキーマ合成 ) subgraph User Service の SDL

    @key: User の同一性を決めるキーは id User Service User info & Profiles type User @key(fields:”id”){ id: ID! name: String } Review Service の SDL extend:この subgraph が所有しない type Review { id: ID! body: String } Review Service Ratings & Comments extend type User @key(fields:”id”){ id: ID! @external reviews: [Review!]! } @external: 他の subgraph で定義
  4. Gatewayの役割2 : Routing subgraph { user(id:”123”) { name __typename id}

    ① { user(id:”123”) { name reviews { body } } { name:”Alice”, id:”123”} ② Federation Router User Service User info & Profiles { "representations": [ { "__typename": "User", "id": "123" } ] } } ① planning & routing ② 結果の合成 {"data": { "_entities": [{ "reviews": [ { "body": "Great product." }, { "body": "Shipping was slow." } ] }]}} Review Service Ratings & Comments
  5. GraphQL Federation の Go のライブラリ • • Wundergraph GraphQL Go

    Tools ◦ 2022年当時、Go のライブラリだとたぶんこれしかなかった Federation v1 と v2 の折衷的な仕様を採用 • • • バージョンアップが難しい GraphQL Federation の使いたい機能をハンドリングしづらい Composition が javascript 製になり、node server が必要になった 素朴な実装でもいいから自分たちで管理できるライブラリを用意して置き換えよう PoC で AI に作らせたら意外とすんなり動いた。いけるのでは 🤔
  6. 新しい Gateway の Composition を常に比較する 1 subgraph Router Config wundergraph

    DB SDL new gateway 差分計算 SDL 新しい Gateway の Router Config は既存のも のを拡張した形式 SDL Compostion するたびに差分がないかを goroutine を利用してチェック
  7. 新しい Gateway の Composition を常に比較する 2 subgraph 拡張した Router Config

    new gateway DB SDL wundergraph 差分計算 SDL 差分が観測されなくなったら primary を入れ替える SDL
  8. 新しい Gateway の Routing を比較する DB subgraph Round Tripper リクエスト

    / レスポンスを記録 router config SDL リクエスト wundergraph SDL new gateway Replay Round Tripper リクエストを記録 / レスポンスは記録済みをreplay 最終的に 2つの系統のリクエストに(意味的な)差分が無いかチェック SDL
  9. 動作比較ではチェックできないこと 動作比較でチェックできるのは「 現行の挙動が変わらないか? 」ということ 動作させてない機能やパターンがあればすり抜けてしまう GraphQL Spec をガードレールにする • •

    • MUST / MUST NOT な spec をリスト テストのコメントにどの spec を検証しているか ID で残す テストされない spec は除外リストで明示的に管理する 齟齬がある場合はテストで検出される