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

GraphQL + Golang でのクエリ最適化

satoya
April 09, 2020

GraphQL + Golang でのクエリ最適化

satoya

April 09, 2020
Tweet

More Decks by satoya

Other Decks in Programming

Transcript

  1. • バックエンド/フロントエンドの共通認識「型」を定義する ◦ 型 → 主に .graphql ファイルなどで表現 • バックエンド/フロントエンドは共通認識の元各々実装を進める

    ◦ バックエンド/フロントエンドで, コミュニティとか仕様追従が強いのは Apollo とか ▪ フロントエンドの typescript + react なりも楽しいです。またの機会に。 ▪ 型からの自動生成ツールがあったりもして便利。 ざっくり GraphQL Schema Driven を実現するための数ある内の一つの仕様
  2. 今回のサーバーサイド環境 • 言語 ◦ golang 1.13 • (主な)ライブラリ ◦ 99designs/gqlgen

    ▪ GraphQL schema から golang 中間コードを生成してくれるツール ▪ Resolver という型を返す部分の実装に注視できます ◦ volatiletech/sqlboiler ▪ DB から golang 中間コードを生成してくれる ORM ▪ クエリ生成が直感的 ▪ Voicy 標準になる気運があるらしいと聞いたのでついでにキャッチアップしました ◦ vektah/dataloaden ▪ GraphQL から提供されているユティリティ Dataloader の golang 実装 ▪ この人がクエリ問題を解決してくれる
  3. vektah/dataloaden を使った実装フロー(例) 1. db に table を用意する 2. volatiletech/sqlboiler で

    model を自動生成 3. 生成された model を参照する type を定義 4. vektah/dataloaden によって, 取得した型の DataLoader を自動生成 5. Fetch 実装 6. Resolver 実装 7. 99designs/gqlgen で schema を解決する中間コードを自動生成 大体自動生成で型安全に解決
  4. vektah/dataloaden によって, 取得した型の DataLoader を自動生成 • dataloaden ローダー名 キー型 取得対象モデル

    ◦ e.g. dataloaden ChannelSliceLoader string '*github.com/somen440/graphql-sample/models. Channel' • 取得対象モデルは, single-quotatio で囲わないと, めっ ちゃ怒られた
  5. Fetch 実装 • key は, 呼び出し側の pk • 今回は, listener_id

    -> followed_channel -> channe.channel_id から channel を取得 ◦ なので listener_id • 返り値は, 各 pk に対応した slice グループにして返してあげる