gg-executor の紹介
1
自己紹介
Nakamura Keisuke (@N9tE9: ネクテク )
好きな標準パッケージ
sync net/http
合同会社 DMM.com 22 年度 新卒入社 〜 24 年 8 月
株式会社 SmartHR 24 年 9 月 ~ 今
最近は Ruby を書いています
golang を書く頻度は減りました
2
3
みなさん GraphQL を使っていますか?
さらっと GraphQL の説明
API のデータ取得 / 操作のクエリ言語
構成要素
● トークナイザ
○ クエリのトークン化
● パーサ
○ →
トークン列 クエリの構文木 ( スキーマ ) の生成
● バリデータ
○ スキーマベースのクエリ検証
4
gg-executor(go-graphql-executor) とは何ぞ?
● トークナイザ
● パーサ
● バリデータ
● エグゼキュータ (optional)
5
golang で graphql linter / code generator をいい感じに作れるようにするツール
リポジトリ : https://github.com/lkeix/gg-executor
ツールを作った背景
6
そもそも golang で GraphQL の開発をする際のツールが絞られる
サーバサイド
- gqlgen
- graphql-go
クライアント
- go-graphql-client
ツールを作った背景
そもそも golang で GraphQL の開発をする際のツールが絞られる
サーバサイド
- gqlgen
- graphql-go
クライアント
- go-graphql-client
7
それぞれ独自実装した Parser を使ってる
ツールを作った背景
8
linter 芸人である N9tE9 からすると golang は統一された AST や Parser があるの
…
に
ツールを作った背景
linter 芸人である N9tE9 からすると golang は統一された AST や Parser …
があるのに
統一した AST や Parser が無いことで何が辛いの?
- エコシステムの開発のハードルが高い
- 各ツールの使い心地がツール開発者のスキルに依存する
- レスポンスのストリーミングできないツールがある
- メモリにクエリ文字列を展開してパースしているのでクソデカクエリが来た時に捌けない
- GraphQL のオーバーヘッドが大きいとはいえ、
単純なクエリのパースに 200 回程度の allocation が発生している
参考 : echo や gin の /v1/users みたいな単純なルーティングは 0 allocation
9
ツールを作った背景
linter 芸人である N9tE9 からすると golang は統一された AST や Parser …
があるのに
統一した AST や Parser が無いことで何が辛いの?
- エコシステムの開発のハードルが高い
- 各ツールの使い心地がツール開発者のスキルに依存する
- レスポンスのストリーミングできないツールがある
- メモリにクエリ文字列を展開してパースしているのでクソデカクエリが来た時に捌けない
- GraphQL のオーバーヘッドが大きいとはいえ、
単純なクエリのパースに 200 回程度の allocation が発生している
参考 : echo や gin の /v1/users みたいな単純なルーティングは 0 allocation
10
go で GraphQL →
のツールを作りたい gg-executor
gg-executor の進捗
11
スキーマ クエリ
トークナイザ Done Done
パーサ ほぼ終わり
残り
- extend のマージ実装
- エラーケース
ほぼ終わり
- エラーケース
バリデータ 未着手 未着手
リポジトリ : https://github.com/lkeix/gg-executor
gg-executor の AST
12
GraphQL Federation on gg-executor
13
GraphQL Federation も念頭に入れた実装になっています
既存の Parser は Federation が導入前にリリースしている
→ gqlgen の内部で gql-parser Federation は parser レベルではサポートしていない
gqlgen と gql-parser →
の責務境界が曖昧 バグを踏んでる箇所がちらほらある
gg-executor は、差分管理で Federation のサポートを考えています
Welcome to contribution
14
gg-executor はまだまだ実装する内容がいっぱいあります!
- リファクタリング
- パース / バリデーション 機能開発
issue や PR をいつでも待っています!
🙏
気になる人は気軽に声を書けてもらえると〜!
15
終わり

n9te9_introdection_gg-executor(go-graphql).pptx

  • 1.
  • 2.
    自己紹介 Nakamura Keisuke (@N9tE9:ネクテク ) 好きな標準パッケージ sync net/http 合同会社 DMM.com 22 年度 新卒入社 〜 24 年 8 月 株式会社 SmartHR 24 年 9 月 ~ 今 最近は Ruby を書いています golang を書く頻度は減りました 2
  • 3.
  • 4.
    さらっと GraphQL の説明 APIのデータ取得 / 操作のクエリ言語 構成要素 ● トークナイザ ○ クエリのトークン化 ● パーサ ○ → トークン列 クエリの構文木 ( スキーマ ) の生成 ● バリデータ ○ スキーマベースのクエリ検証 4
  • 5.
    gg-executor(go-graphql-executor) とは何ぞ? ● トークナイザ ●パーサ ● バリデータ ● エグゼキュータ (optional) 5 golang で graphql linter / code generator をいい感じに作れるようにするツール リポジトリ : https://github.com/lkeix/gg-executor
  • 6.
    ツールを作った背景 6 そもそも golang でGraphQL の開発をする際のツールが絞られる サーバサイド - gqlgen - graphql-go クライアント - go-graphql-client
  • 7.
    ツールを作った背景 そもそも golang でGraphQL の開発をする際のツールが絞られる サーバサイド - gqlgen - graphql-go クライアント - go-graphql-client 7 それぞれ独自実装した Parser を使ってる
  • 8.
    ツールを作った背景 8 linter 芸人である N9tE9からすると golang は統一された AST や Parser があるの … に
  • 9.
    ツールを作った背景 linter 芸人である N9tE9からすると golang は統一された AST や Parser … があるのに 統一した AST や Parser が無いことで何が辛いの? - エコシステムの開発のハードルが高い - 各ツールの使い心地がツール開発者のスキルに依存する - レスポンスのストリーミングできないツールがある - メモリにクエリ文字列を展開してパースしているのでクソデカクエリが来た時に捌けない - GraphQL のオーバーヘッドが大きいとはいえ、 単純なクエリのパースに 200 回程度の allocation が発生している 参考 : echo や gin の /v1/users みたいな単純なルーティングは 0 allocation 9
  • 10.
    ツールを作った背景 linter 芸人である N9tE9からすると golang は統一された AST や Parser … があるのに 統一した AST や Parser が無いことで何が辛いの? - エコシステムの開発のハードルが高い - 各ツールの使い心地がツール開発者のスキルに依存する - レスポンスのストリーミングできないツールがある - メモリにクエリ文字列を展開してパースしているのでクソデカクエリが来た時に捌けない - GraphQL のオーバーヘッドが大きいとはいえ、 単純なクエリのパースに 200 回程度の allocation が発生している 参考 : echo や gin の /v1/users みたいな単純なルーティングは 0 allocation 10 go で GraphQL → のツールを作りたい gg-executor
  • 11.
    gg-executor の進捗 11 スキーマ クエリ トークナイザDone Done パーサ ほぼ終わり 残り - extend のマージ実装 - エラーケース ほぼ終わり - エラーケース バリデータ 未着手 未着手 リポジトリ : https://github.com/lkeix/gg-executor
  • 12.
  • 13.
    GraphQL Federation ongg-executor 13 GraphQL Federation も念頭に入れた実装になっています 既存の Parser は Federation が導入前にリリースしている → gqlgen の内部で gql-parser Federation は parser レベルではサポートしていない gqlgen と gql-parser → の責務境界が曖昧 バグを踏んでる箇所がちらほらある gg-executor は、差分管理で Federation のサポートを考えています
  • 14.
    Welcome to contribution 14 gg-executorはまだまだ実装する内容がいっぱいあります! - リファクタリング - パース / バリデーション 機能開発 issue や PR をいつでも待っています! 🙏 気になる人は気軽に声を書けてもらえると〜!
  • 15.