Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DataloaderのGraphQLを超えた活用を考えてみた

 DataloaderのGraphQLを超えた活用を考えてみた

GraphQL には潜在的にパフォーマンスを悪くする可能性があり、その解決策の 1 つとして Dataloader があります。 SHE株式会社ではこの問題に対して様々な工夫をしていますが、今回はその 1 つである Dataloader を深掘りし GraphQL に収まらない汎用的な知識としてお伝えできればと思います。

Yan | 近藤智哉

July 29, 2023
Tweet

More Decks by Yan | 近藤智哉

Other Decks in Technology

Transcript

  1. 1. ⾃⼰紹介 近藤 智哉 Kondo Motoya 󰠁GraphQL / React (バックエンド‧フロン

    トエンドを担当することが多いです) 🏢 求⼈プラットフォームの会社 → IP 電話と解析システムのスタートアップ → 美容系のベンチャー → SHE 株式会社 🥰 旅⾏
  2. 3. Dataloader を感覚で理解する 📎バッチを感覚で理解する バッチを使わない バッチを使う あ。⼿紙送ろう!お願いします! 任せて! あ。もう⼀通あった うん

    友達からこれもって ⾔われた え。。 あ。⼿紙だ。とりあえず 5 分後に配達を依頼しよ。 あ。もう⼀通あった 友達からこれもって ⾔われた、お願い! 任せて! 📎束にする (batched)
  3. 3. Dataloader を感覚で理解する 🔖キャッシュを感覚で理解する Batch に加えて、Cache を参照することで Datasource へのアクセスを減らす Dataloader

    Datasource (RDB) ID in 3 Return records { type: 1, projectId: 2} { type: 3, projectId: 2} { type: 2, projectId: 1} { type: 1, projectId: 4} 10 4 2 1 ID in 1, 2 Cache (Map)
  4. 4. GraphQL での活⽤ GraphQL では先読み込みをしてN+1 を防ぐことが難しい。 しかし Dataloader を利⽤することで遅延させて N+1

    を防ぐことができる。 query { authors { books { title } } } author ごとに book を取得する処理が走る。 実行回数が authors の取得に 1 回、N 個の authors につい てそれぞれ book を取得するので N 回のデータ取得が発生 する。(N+1問題)
  5. 4. GraphQL での活⽤ GraphQL では先読み込みをしてN+1 を防ぐことが難しい。 しかし Dataloader を利⽤することで遅延させて N+1

    を防ぐことができる。 BE Dataloader (Batch) Datasource (RDB) ID = 1 ID = 2 ID in 1, 2 Return records Query1 Query2 request response Dataloader (Cache) ID = 1, 2, 3 ID in 1, 2 Store Return records ID in 3 Return records Query1 results Query2 results
  6. 4. GraphQL での活⽤ GraphQL では潜在的に Query をいくらでも深くできたり連結できてしまう。 Dataloader を利⽤することで、Datasource へのアクセスを限られた回数に制限できる。

    query { author1: authors { books { title } } author2: authors { … } GraphQL では上記のように同じ Query に別をつけて複数回 列挙することもできてしまう。
  7. 4. GraphQL での活⽤ GraphQL では潜在的に Query をいくらでも深くできたり連結できてしまう。 Dataloader を利⽤することで、Datasource へのアクセスを限られた回数に制限できる。

    BE Dataloader (Batch) Datasource (RDB) ID = 1 ID = 2 ID in 1, 2 Return records Query1 Query2 request Dataloader (Cache) ID = 1, 2, 3 ID in 1, 2 Store Return records ID in 3 Return records Query1 results Query2 results …
  8. 5. Dataloader の GraphQL 以外での活⽤を考える Redis などを使うほどでもなく、簡単にキャッシュ構造を実現したい時 Cache のみ利⽤。 権限についての問い合わせを受ける

    API 側で、特定の時間は結果をアプリケーションで保持 する。 ※ Cache の⽅法は Map 以外を利⽤した⽅が良いかも
  9. 5. Dataloader の GraphQL 以外での活⽤を考える 複数箇所から呼ばれる可能性のあるデータ取得ロジック DBなどのDatasourceへのアクセスとドメインロジックの両⽅を含むロジックに利⽤する。 Dataloader を利⽤すると呼び出し元でデータを先に読み込みする必要がなくなる。 (Entity,

    Model に導⼊するようなイメージ) ※ Dataloader は Promise を返すので、その処理はアクセス元でする必要がある BE ロジック1 Dataloader ID = 1, 3, 5, 6, 7 request ロジック2 ID = 6, 7, 8, 10 Return records execute execute