Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GraphQLにおけるクライアントキャッシュ戦略
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
KazukiHayase
March 16, 2023
Technology
3.6k
0
Share
GraphQLにおけるクライアントキャッシュ戦略
KazukiHayase
March 16, 2023
More Decks by KazukiHayase
See All by KazukiHayase
entのPrivacy機能とgo/astを使って、意図しないDBアクセスを防ぐ
kazukihayase
1
380
go testのキャッシュの仕組みにDeep Diveする
kazukihayase
0
150
要件定義・デザインフェーズでもAIを活用して、コミュニケーションの密度を高める
kazukihayase
0
540
CIでのgolangci-lintの実行を約90%削減した話
kazukihayase
0
550
もし今からGraphQLを採用するなら
kazukihayase
13
5.9k
Goでテストをしやすくするためにやったこと
kazukihayase
1
920
GraphQLクライアントの技術選定 2023冬
kazukihayase
9
7.8k
Introduction and Insights of the Hasura-based Architecture
kazukihayase
0
1.1k
自分だけが頑張るのをやめて、フルスタックなチームを作る
kazukihayase
2
3.6k
Other Decks in Technology
See All in Technology
AWS Agent Registry の基礎・概要を理解する/aws-agent-registry-intro
ren8k
3
370
自立を加速させる神器 - EMOasis #11
stanby_inc
0
140
コミュニティ・勉強会を作るのは目的じゃない
ohmori_yusuke
0
210
Azure Static Web Apps の自動ビルドがタイムアウトしやすくなった状況に対応した件/global-azure2026
thara0402
0
410
みんなの「データ活用」を支えるストレージ担当から持ち込むAWS活用/コミュニティー設計TIPS 10選~「作れる」より、「続けられる」設計へ~
yoshiki0705
0
250
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
23k
ハーネスエンジニアリングをやりすぎた話 ~そのハーネスは解体された~
gotalab555
4
1.7k
AWS認定資格は本当に意味があるのか?
nrinetcom
PRO
2
270
AIはハッカーを減らすのか、増やすのか?──現役ホワイトハッカーから見るAI時代のリアル【MEGU-Meet】
cscengineer
0
160
Hacobu Tech Deck
hacobu
PRO
0
110
小説執筆のハーネスエンジニアリング
yoshitetsu
0
690
Choose your own adventure in agentic design patterns
glaforge
0
140
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.8k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.6k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
190
Done Done
chrislema
186
16k
Facilitating Awesome Meetings
lara
57
6.8k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Designing for Timeless Needs
cassininazir
0
190
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
320
Paper Plane
katiecoart
PRO
1
49k
Accessibility Awareness
sabderemane
1
100
Transcript
GraphQLにおけるクライアントキャッシュ戦略 2023.03.15リクルート × BASE × バイセル 【第1回フロントエンド勉強会】React & GraphQL 2023.03.15
自己紹介 名前:早瀬和輝 出身:愛知県名古屋市 経歴:BuySell Technologiesに2021年に新卒入社 趣味:開発、マンガ、アニメ、ベース、バスケ Twitter:@KazukiHayase
はじめに • 今回話すのはクライアント側のキャッシュについて • CDNなどのキャッシュについては触れないです
アジェンダ キャッシュの仕組み 01 キャッシュにおける課題 02 課題解決へのアプローチ 03 まとめ 04
アジェンダ キャッシュの仕組み 01 キャッシュにおける課題 02 課題解決へのアプローチ 03 まとめ 04
キャッシュの仕組み • いくつかのGraphQL Clientにはキャッシュ機構が備わっている ◦ Apollo Client, Relay, urql •
キャッシュを活用することで無駄なリクエストが減る • そのためにはキャッシュ機構の正しい理解が必要
キャッシュ機構において重要な要素 データの正規化 01 キャッシュの 利用条件 02
データの正規化 • レスポンスデータは正規化されてキャッシュに保存される • 正規化することで ◦ キャッシュへのアクセスが早くなる ◦ データサイズを小さくすることができる
正規化の流れ 1. Queryの結果を個別のオブジェクトに分割 2. 分割したオブジェクトに一意な識別子を割り当て 3. フラットなデータ構造に格納
正規化の流れの例 右図のような SchemaとQueryを考える ※ Apollo Clientを例に解説しますが、 他のClientでも大枠の流れは同じです
正規化の流れの例 Queryの実行結果として 右図のようなレスポンスを受け取る
正規化の流れの例 1. Queryの結果を個別の オブジェクトに分割 2. 分割したオブジェクトに一意 な識別子を割り当て 3. フラットなデータ構造に格納
正規化の流れの例 1. Queryの結果を個別の オブジェクトに分割 2. 分割したオブジェクトに一意 な識別子を割り当て 3. フラットなデータ構造に格納 Task:1
Task:2 Task:3
正規化の流れの例 1. Queryの結果を個別の オブジェクトに分割 2. 分割したオブジェクトに一意 な識別子を割り当て 3. フラットなデータ構造に格納
キャッシュの利用条件 • データが全てキャッシュにある場合はキャッシュを利用 • 一部でもデータがキャッシュにない場合はリクエストを実行
キャッシュの利用条件 • FetchTasks→FetchTasks2 ◦ キャッシュが利用できない ◦ リクエストは2回 • FetchTasks2→FetchTasks ◦
キャッシュが利用できる ◦ リクエストは1回
アジェンダ キャッシュの仕組み 01 キャッシュにおける課題 02 課題解決へのアプローチ 03 まとめ 04
キャッシュにおける課題 一部でもデータがキャッシュにない場合はリクエストが実行される Queryの定義によっては全くキャッシュが利用されない
キャッシュにおける課題 逆に常にキャッシュが利用されるようにしようとすると 考慮するべきことが多い
キャッシュにおける課題 仮に常にキャッシュが利用されるようにしようとすると • Queryの実行順序を工夫する • オブジェクト単位でQueryをまとめる • アプリケーション全体でQueryを使い回す
できなくはないが、、
個人的にはデメリットの方が大きいと判断
キャッシュにおける課題 • Queryの実行順序を工夫する ◦ →実行順序まで考慮するのは現実的ではない • オブジェクト単位でQueryをまとめる ◦ →オーバーフェッチにつながる、RESTとほぼ変わらない •
アプリケーション全体でQueryを使い回す ◦ →Query変更時の影響範囲が広い
アジェンダ キャッシュの仕組み 01 キャッシュにおける課題 02 課題解決へのアプローチ 03 まとめ 04
課題解決へのアプローチ ページ単位での キャッシュ最適 化 01 データを 3種類に分類 02
ページ単位でのキャッシュ最適化 • ページ単位でキャッシュ最適化を考える • アプリケーション全体でのキャッシュの利用は考慮しない ◦ Queryによってはキャッシュが利用される場合もある
ページ単位でのキャッシュ最適化 ページを跨いだキャッシュの利用を考慮しないことで • ページで使用するデータを宣言的に定義できる ◦ GraphQLの良さを最大限活かす • ページ同士が疎結合になる ◦ Queryの変更の影響範囲が閉じる
データを3種類に分類 データを3種類に分類して、分類ごとにQueryを定義 することでキャッシュを利用しやすくする
データを3種類に分類 コンテンツデータ マスタデータ 汎用マスタデータ 01 02 03
コンテンツデータ • コンテンツ表示用のデータ • アクションに応じてQueryを定義する ◦ e.g. 初回表示、検索、モーダル ◦ 1ページに複数のQueryが定義されていることもある
• 同じアクションであればキャッシュが利用される
マスタデータ • マスタデータやメタデータなどのシステム的に必要なデータ • 最初のレンダリング時のみリクエストが必要 • 2回目以降はキャッシュを利用する
汎用マスタデータ • 基本的には使用しない ◦ コンテンツデータ・マスタデータのみの運用をまずは考える • アプリケーション全体で利用するかつサイズの大きいデータ • どうしてもアプリケーション全体でキャッシュしたい際に使用 •
オーバーフェッチを許容
データ分類フロー ユーザーのアクションによって取得データが変わるか? コンテンツデータ マスタデータ 汎用マスタデータ Yes ページごとで重複して取得する事に パフォーマンス上の懸念があるか? No Yes
No
全体像 PageComponentA PageComponentA ContentQuery PageComponentA MasterQuery GeneralMasterQuery PageComponentB PageComponentB ContentQuery
PageComponentB MasterQuery ページコンポーネントごとに コンテンツ・マスタデータのQueryを定義 汎用マスタデータのQueryは コンポーネントの外で定義
データ分類の例 タスク検索画面
コンテンツデータ • タスクの検索結果のデータ • 検索の度に表示内容が変わる • 同じ検索条件ならキャッシュ を利用
マスタデータ • 検索で利用する選択肢データ • 検索結果に関係なくデータは 同じ • 初回以降はキャッシュを利用
汎用マスタデータ • 検索で利用する選択肢データ • 数千規模のデータかつ 他の画面でも使うと仮定 • この画面のみの利用であれば マスタデータに含める
アジェンダ キャッシュの仕組み 01 キャッシュにおける課題 02 課題解決へのアプローチ 03 まとめ 04
まとめ • キャッシュの仕組みを踏まえた上での戦略 ◦ ページ単位でのキャッシュ最適化 ◦ データを3種類に分類 • GraphQLの良さを生かしつつ、キャッシュも活用できる •
ただし懸念はある ◦ 汎用データが増えすぎると今回紹介した課題が再度浮上する
THANK YOU