GraphQL - arosh/arosh.github.com GitHub Wiki

dataloaden

https://github.com/vektah/dataloaden

dataloaden は GraphQL や gqlgen と一緒によく使われるが何の関係もない。

単に

  • loader.Load() が呼ばれたら、しばらく(数ミリ秒)待つ
  • その間に届いたリクエストをスライスにまとめて、fetch に設定した関数に渡す
  • fetch に設定した関数からの戻り値のスライスをリクエストに分配する

という処理を実現するための loader のインスタンスを作りやすくするジェネレータを提供するだけである。

https://gqlgen.com/reference/dataloaders/

なぜ context に Loader のインスタンスを設定するのか?

たいていの場合は Loader をグローバル変数にしてしまっても問題ない。しかし少し凝ったことをやろうとすると context に入れるのがよい戦略にみえてくる。

たとえば認証関係の値(参照を試みているユーザー名など)やその他のパラメータをリクエストヘッダやクエリパラメータで渡していたとして、それをどのように Loader に渡せばよいだろうか? loader の引数に入れればそれでよいと思うかもしれないが、loader に与えられる引数は keys だけである。また loader.Load() は「しばらく待ってまとめて処理する」という仕組みのため、loader をグローバル変数にしてしまうと、いろいろなパラメータを持つ複数のリクエストに対するレスポンスをうまく扱ってやる必要がある。

この背景をもとにすると、context は妥当な選択だとわかる。context はリクエストを単位とするスコープを持つので、別のリクエストの値が混ざることがない。