N + 1 問題 と collect_path.yml について
目的
GraphQLはN+1問題が発生しやすい。UZUではentの手法に従い、Dataloaderではなくeager loadingアプローチを使用。
解決する問題
- クエリに
validParticipantsなどのフィールドが含まれる場合、participantsをeager loadする必要がある - クエリはクライアントが生成するため、バックエンドは要求されるフィールドを予測できない
collect_path.ymlは実行時にeager loadが必要なフィールドを定義
設定フォーマット
yaml
Event:
validParticipants:
- with: Participants
type: Participant使用手順
1. collect_path.yamlの設定
- 第1レベル: GraphQLタイプ
- 第2レベル: GraphQLフィールド
with: eager load用のエンティティ名(entのWith○○と一致)type: エンティティタイプmethod: 複雑なシナリオ用のカスタムメソッド
2. コード生成
bash
go generate ./internal/ent/generate_collect_path.go3. リゾルバーでの使用
go
func (r *queryResolver) Authors(ctx context.Context) ([]*ent.Author, error) {
return r.client.Author.Query().CollectPaths(ctx).All(ctx)
}