Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GraphQL + Golang でのクエリ最適化
Search
satoya
April 09, 2020
Programming
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GraphQL + Golang でのクエリ最適化
satoya
April 09, 2020
More Decks by satoya
See All by satoya
GraphQL が仲間になりたそうにこちらを見ている
somen440
0
120
Other Decks in Programming
See All in Programming
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
170
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
280
Java 27新機能 / Java 27 new features
kishida
2
190
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
220
Verilogで学ぶCPU自作入門.pdf
uyuki234
8
4k
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
250
AHC070解法紹介
eijirou
0
150
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.8k
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
100
wkhtmltopdfの次どうするか問題2026
willnet
2
1.8k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
6.1k
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
430
Featured
See All Featured
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Claude Code のすすめ
schroneko
67
230k
How to make the Groovebox
asonas
2
2.5k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
300
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
300
GitHub's CSS Performance
jonrohan
1033
470k
The Curious Case for Waylosing
cassininazir
1
550
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Typedesign – Prime Four
hannesfritz
42
3.2k
Transcript
GraphQL + Golang でのクエ リ最適化 やっさん
当初の予定... GraphQL が知らない人でも興味を持って もらえるようにと心を込めたスライドを SpeakerDeck の方に用意しました! 興味があればどうぞ!
• バックエンド/フロントエンドの共通認識「型」を定義する ◦ 型 → 主に .graphql ファイルなどで表現 • バックエンド/フロントエンドは共通認識の元各々実装を進める
◦ バックエンド/フロントエンドで, コミュニティとか仕様追従が強いのは Apollo とか ▪ フロントエンドの typescript + react なりも楽しいです。またの機会に。 ▪ 型からの自動生成ツールがあったりもして便利。 ざっくり GraphQL Schema Driven を実現するための数ある内の一つの仕様
GraphQL サーバーサイド実装を Golang でやった場合のクエリ最適化について 今回は!
今回のサーバーサイド環境 • 言語 ◦ golang 1.13 • (主な)ライブラリ ◦ 99designs/gqlgen
▪ GraphQL schema から golang 中間コードを生成してくれるツール ▪ Resolver という型を返す部分の実装に注視できます ◦ volatiletech/sqlboiler ▪ DB から golang 中間コードを生成してくれる ORM ▪ クエリ生成が直感的 ▪ Voicy 標準になる気運があるらしいと聞いたのでついでにキャッチアップしました ◦ vektah/dataloaden ▪ GraphQL から提供されているユティリティ Dataloader の golang 実装 ▪ この人がクエリ問題を解決してくれる
GraphQL のメリットとして • フロントエンドの描画都合によって好きなようにリソースを取得できる ◦ このページでは, 「放送名」「フォロワー数」の一覧が分かれば大丈夫 ◦ こっちのページでは「放送名」「放送詳細」「放送一覧」が欲しい …
etc • バックエンド実装では, 特にその辺りのコンテキストを意識することなく型を返す実 装を行えばいい
\ 好きなように /
Listener と Channel を想定(Listener->Channel) 例えば 分かりやすく単一方向の依存がある型たちを用意します
この型を先ほど紹介した gqlgen で自動生成すると problem: struct の slice を持ってしまう
どういうことか?
これを解決するテーブルを用意したとして ...
ベタベタに Resolver 実装すると …… Lister の型が解決されるときに , 毎回全依存関係の解決もあることになっ てしまう。
結果として ... 結果としては, 欲しいリソースが取得できるものの followed 情報の必要可否に関わらず , クエリ発行されてしまう これを解決するために(例えばヘッダーのありなしといった)コンテキスト で解決する?
→ 本末転倒
終わりです N+1 問題 スロークエリ サービス品質低下 深夜対応 …… なり響く電話
そうしないために(本題) 長かったね ...
GraphQL Dataloader Pattern 依存する情報を集めて最後に Fetch して解決するパターン
vektah/dataloaden を使った実装フロー(例) 1. db に table を用意する 2. volatiletech/sqlboiler で
model を自動生成 3. 生成された model を参照する type を定義 4. vektah/dataloaden によって, 取得した型の DataLoader を自動生成 5. Fetch 実装 6. Resolver 実装 7. 99designs/gqlgen で schema を解決する中間コードを自動生成 大体自動生成で型安全に解決
db に table を用意する
volatiletech/sqlboiler で model を自動生成 • sqlboiler driver するだけでめっちゃ楽でした • 単一テーブルに対するクエリ生成とマッピングは最強そう
• inner join がお察しなのは把握してしまった ...
生成された model を参照する type を定義 @goModel で指定できる もしかしたら client 側も自動生成
ツールを使う場合, 競合することが あるのかも … ??
vektah/dataloaden によって, 取得した型の DataLoader を自動生成 • dataloaden ローダー名 キー型 取得対象モデル
◦ e.g. dataloaden ChannelSliceLoader string '*github.com/somen440/graphql-sample/models. Channel' • 取得対象モデルは, single-quotatio で囲わないと, めっ ちゃ怒られた
Fetch 実装 • key は, 呼び出し側の pk • 今回は, listener_id
-> followed_channel -> channe.channel_id から channel を取得 ◦ なので listener_id • 返り値は, 各 pk に対応した slice グループにして返してあげる
Resolver 実装 • Load に対して key となるものを渡すだけ
99designs/gqlgen で schema を解決する中間コードを 自動生成 schema に適するような interface の提供とかも
動作確認!
folloed ( フォローしてるチャンネル) Channel への依存あり 依存しているため SQL が発行されてい る
folloed ( フォローしてるチャンネル) Channel への依存なし 依存がないためクエリが発行されていな い
Where in として SQL が発行されてい て, N+1 問題を解決している
必要な時に必要なだけのクエリが流れた
Dataloader を上手く使って GraphQL でも 最適化。本番運用に耐えうる設計を! そして永眠しましょう 完