🔖

ChatGPT 先生に graphql/dataloader のソースコードを読んでもらう

2023/03/18に公開

この記事は ChatGPT 先生に graphql/dataloader のソースコードを読んでもらった記録です。記事中のスクリーンショットは OpenAI の GPT-4 である ChatGPT から得られたものです。

私は1年と少し前にこのリポジトリを全て読みましたが、その際は開発者による動画での説明や関連ドキュメントを読んで仕組みを理解するまで数日かかりました。

今日ふと思い立って試しに ChatGPT 先生に読んでもらったところ私自身が理解した場所まで一瞬で到達してしまい、あまりに驚いたためインターネットに書き残すことにしました。

graphql/dataloader とは

graphql/dataloader は GraphQL アプリケーションのデータ取得に使用される汎用的なユーティリティで、Node.js の GraphQL サーバーで使われている。

GraphQL のクエリにおいて、各フィールドの値は Resolver と呼ばれる関数によって取得される。Resolver がデータベースを読み書きする場合、通常は非同期処理(JavaScript であれば Promise)となる。GraphQL は全ての Promise を並行して待つ。

例えば解決しようとするフィールドがオブジェクトの配列である場合、GraphQL は対象となるオブジェクトの取得後さらに各フィールドを解決するために処理を続行するので、配列の要素ごとに非同期処理が実行されてしまうことがある(いわゆる 1+N 問題)。

これを防ぐには、バッチ処理や結果のキャッシュを通じてバックエンドの API やデータベースへのアクセスを減らす必要があり、そのためのユーティリティが graphql/dataloader である。

参考:

ChatGPT 先生に読んでもらう

リポジトリには沢山のファイルがあるが、実質的には src/index.js に全て書かれている。これを ChatGPT 先生にそのまま渡しつつ、コードの内容を要約してもらう。

要約結果

「要約してください」と伝えた結果、だいたい合っている。

これくらいなら README を読めばすぐ分かる。先生の実力はこんなものではない。

結果に対する質問と回答

バッチ処理とキャッシュの詳細な仕組み

一つ目の質問でバッチ処理とキャッシュが主要な機能であるという回答を得たので、詳細に聞いてみる。これもほぼ合っている。イベントループごとにバッチ処理をするのが肝なのだが、先生がしっかりそこに言及されており信頼感が増した。

キャッシュの消去

次に、キャッシュを消去する方法を聞いてみる。これも合っている。親切なことに簡単なサンプルコードを提供してくれた。

バッチ処理のスケジューリング変更方法

少し高度な質問をしてみる。バッチ処理のスケジューリング変更方法を聞いたのだが、それに加えて実装時の注意点を教えてくれた。

バッチ処理失敗時の挙動

バッチ処理の実行に失敗した場合について質問してみた。実際に対応するキャッシュは削除されるのでこれも正解。追加でエラー処理についていろいろ教えてくれた。

キャッシュの増加

キャッシュの問題点について聞いてみる。回答は間違っていないのだが、正確にはデフォルトの挙動として DataLoader インスタンスがクライアントからのリクエストごとに作られ参照されなくなると GC によって消されるのでキャッシュの増加によってメモリが枯渇する可能性は考えづらい。Facebook の production 環境でもそのような実装となっていると開発者が冒頭の動画で言及していた。

バッチ処理せずにキャッシュに書き込む方法

バッチ処理を迂回してキャッシュに書き込む方法を聞いてみる。これも合っている。

最後に

この内容をブログに書いていいか聞いたところ、大丈夫とのことだったので Zenn に書きました。

記事冒頭にも記載していますが、本記事中のスクリーンショットは OpenAI の GPT-4 である ChatGPT から得られたものです。

感想

趣味や仕事でコードを書く際に様々なオープンソースのライブラリを使うことがある。そこで何か問題が起きると(大抵は自分のコードに問題があるのだが)ライブラリのドキュメントやコードを読むことになる。

ChatGPT は膨大なコードやテキストを分かりやすく要約した上で不明な点を対話的に解消していくことができるので、コードリーディングのための道具として非常に優れていると感じた。

Discussion