よこやまの日記・ブログを自作する編

車輪の再開発でも自分専用ブログをつくるんや!

19日目: 勢いでN+1問題対応入れたけど今は不要だった

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

GraphQLの怖いところN+1

前回は一つのクエリが重くなることに対する負荷対策を入れた。(実際問題としてできているかは微妙だけど)

今回は、GraphQLで陥りがちなデータベースアクセスのN+1問題について対策する。 N+1問題は、配列の要素で入れ子になった項目を再帰的に取得しにいってしまうためにデータベースに高頻度のアクセスが発生してしまう問題。

これについても対策する機能は用意されている。それがこちら。

github.com

コレを使うことで、都度DBアクセスをするのでなく、ある程度まとめて取得しに行くことを実現できる。 で、早速導入をしてみたんだけど、結果的には現時点ではあまり効力を発揮しなさそう。どちらかというと前後の記事を取得するところで必要そうだけど、あちらはちょっと複雑なクエリなので導入を見送り。

導入の仕方

防備録としてもメモしておく。

N+1対策したい対象に対して以下のようにDataLoaderの生成を定義する。もともと配列を返す箇所についてはこちらも同様に配列をしている。intはIDがint型であるため。IDが文字列型ならstringを指定。

//go:generate go run github.com/vektah/dataloaden ArticleLoader int *github.com/hiroyky/legato/domain/dbmodel.Article
//go:generate go run github.com/vektah/dataloaden ArticleSliceLoader int []*github.com/hiroyky/legato/domain/dbmodel.Article

生成

$ go generate ./
$ go generate ./...

生成されたDataLoaderを使って呼び出しを行う。

詳細は本日のプルリクで。

github.com