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
NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影
Search
gree_tech
PRO
September 18, 2020
Technology
0
170
NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影
GREE Tech Conference 2020 で発表された資料です。
https://techcon.gree.jp/2020/session/Session-2
gree_tech
PRO
September 18, 2020
Tweet
Share
More Decks by gree_tech
See All by gree_tech
kustomizeをいい感じに使う方法
gree_tech
PRO
3
1.2k
スケーラビリティとコスト管理 Google Cloud Spanner 費用最適化の取り組み
gree_tech
PRO
0
540
「アナザーエデン 時空を超える猫」の5年前のログを引っ越してデータドリブンで事業運用プロセスを改善した話
gree_tech
PRO
0
380
Unity,PHP+Jenkins+GAS 多言語対応を意識させない開発を目指したシステム構築
gree_tech
PRO
0
830
全社総会における「REALITY Spaces」の活用と、Addressableを用いたコンテンツ配信技術について
gree_tech
PRO
0
500
AWSのEKS環境でログ機能を構築/リリースしたお話
gree_tech
PRO
0
380
「ヘブンバーンズレッド」の大規模アップデートにおける国内及び翻訳QAの取り組み
gree_tech
PRO
0
460
アプリ「REALITY」の12言語対応プロセスの仕組みと品質向上の取り組み
gree_tech
PRO
0
700
REALITYアプリのメンテナンスなしでの機能リリースを実現する、Istio導入とB/Gデプロイ実現の取り組み
gree_tech
PRO
0
570
Other Decks in Technology
See All in Technology
AI JIMY - 登壇(インストール編)
hanacchi
0
150
TypeScript の抽象構文木を用いた、数百を超える API の大規模リファクタリング戦略
yanaemon
6
1.3k
シンプルなHITL機械学習と様々なタスクにおけるHITL機械学習
naohachi89
0
340
1Q86
kawaguti
PRO
2
190
OpenID Foundation updates
fujie
0
230
生成AIと産業向けソフトウェアの自動生成 〜 ハノーバーメッセ2024より〜
kioto
2
440
[2024년 5월 세미나] 생성형 AI와 함께하는 데이터 분석가 커리어
datarian
0
1.3k
#phpconkagawa レガシーコードにもオブザーバビリティを 〜少しずつ始めるサービス監視〜
yamato_sorariku
0
560
複雑なビジネスルールに挑む:正確性と効率性を両立するfp-tsのチーム活用術 / Strike a balance between correctness and efficiency with fp-ts
kakehashi
5
3.7k
テストコードを書きながらCompose Multiplatformを乗りこなす
subroh0508
0
150
ハードウェアを動かすTypeScriptの世界
9wick
3
1.2k
[PyconUS 2024] Having fun with Pydantic and pattern matching
enforcerpl
0
190
Featured
See All Featured
Visualization
eitanlees
137
14k
Fantastic passwords and where to find them - at NoRuKo
philnash
39
2.5k
Building a Scalable Design System with Sketch
lauravandoore
457
32k
Embracing the Ebb and Flow
colly
80
4.2k
Into the Great Unknown - MozCon
thekraken
15
1.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
345
19k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
We Have a Design System, Now What?
morganepeng
43
6.8k
Automating Front-end Workflow
addyosmani
1357
200k
Become a Pro
speakerdeck
PRO
13
4.6k
Robots, Beer and Maslow
schacon
PRO
155
8k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
18
7k
Transcript
NuxtJS + REST APIで 運用中サービスをNuxtJS + GraphQL に変更したことによる光と影 アウモ株式会社 エンジニアチームマネージャー
村田翔
自己紹介 2 • 名前 • 村田 翔 • 担当 •
サーバーサイド兼フロントエンドエンジニア • メインはRuby on Rails • aumo歴 • 3年弱(サーバーサイドでは最古参) • 旅行好きなのもあって、aumoに長らく在籍
3 ⓘ Start presenting to display the poll results on
this slide. aumoはご存知ですか?
• おでかけ領域をメインに、旅行やグルメ情報をお届けするメディア • アプリ • Webサービス aumoはご存知ですか? 4 記事サイト 比較サイト
<- 今回NuxtJS + GraphQLに変更した対象
5 記事 × SNS iOS Android
6 記事 × ユーザー生成コンテンツ
7 記事 × ユーザー生成コンテンツ × ホテル × 宿泊プラン横断検索
8 記事 × ユーザー生成コンテンツ × グルメ
9 記事 × ユーザー生成コンテンツ × レジャー・ショッピング
1.なぜREST APIからGraphQLに変更したのか 2.GraphQL化して見えたこと • 光 • エンドポイント • 仕様変更 •
影 • N+1 • エラーハンドリンク • ログ解析 今日お伝えすること 10
1.なぜREST APIからGraphQLに変更したのか 2.GraphQL化して見えたこと • 光 • エンドポイント • 仕様変更 •
影 • N+1 • エラーハンドリンク • ログ解析 今日お伝えすること 11
12 ⓘ Start presenting to display the poll results on
this slide. GraphQL使っていますか?
• バックエンド • Ruby on Rails • REST API •
GraphQL • graphql • graphql-batch • graphiql-rails • フロントエンド • NuxtJS • ログ監視 • Papertrail • Sentry 構成 13
構成 14 Amazon EC2 Amazon EC2 ELB サブドメインで 3サイトを同一インスタンスに搭載 フロントエンド
バックエンド
構成 15 Amazon EC2 Amazon EC2 ELB サブドメインで3サイト搭載 • middlewareでFQDN毎にパスチェック
• 各トップページはFQDNを元にコンポーネント出しわけ • 各詳細ページはNuxtJSのディレクトリ規約に沿って設置 フロントエンドでのサイト分割
• エンドポイントを極力増やしたくない • 工数削減 16
初期から3サイト作成 という要件なのかというと... 17
初期要件 18 • ホテルの比較サイトを作りましょう • 単一サイトなので既存の記事サイト同様にバックエンドはREST API でいいか
• グルメのサイトも作りましょう • バックエンドはAPIのエンドポイント増やして対応すればいいか 要件追加 19
要件追加 20 • レジャー・ショッピングのサイトも作りましょう • さらに別ジャンルで展開する可能性出てくるなこれ🤔 • APIのエンドポイントを都度増やしていくのは何だかなぁ
要件追加 21 • 各サイトを巡回されるような動線になる要素欲しいですね • 各サイト用に用意しているAPIエンドポイントそれぞれ修正いるな • API多いと作業煩雑だし、また類似の要件追加くるだろなこれ 🤔
そこで... 22
• クエリ言語 • エンドポイント単一 • 必要な情報だけ取得できる • クエリで指定したフィールドのみ返却される • Facebook社が2012年から開発
• 採用している組織はFacebook、GitHub、PayPalなど数百を越す GraphQLとは 23
各サイトで必要な情報を共通のエンドポイントで 網羅できるのは、実装が楽になりそうな予感! ※新しい技術を取り入れたい欲有あり 24
実際にREST API -> GraphQL化してみた 25
1.なぜREST APIからGraphQLに変更したのか 2.GraphQL化して見えたこと • 光 • エンドポイント • 仕様変更 •
影 • N+1 • エラーハンドリンク • ログ解析 今日お伝えすること 26
エンドポイント 27 [GET] /api/v1/hotels [GET] /api/v1/hotels/{hotel_id} [GET] /api/v1/hotels/search [GET] /api/v1/gourmets
[GET] /api/v1/gourmets/{gourmet_id} ・ ・ ・ ルーティング追加して、 コントローラー追加して、 ビュー追加して・・・ • サイト追加毎に増えていくエンドポイント...
• エンドポイント単一 エンドポイント 28 [GET] /api/v1/hotels [GET] /api/v1/hotels/{hotel_id} [GET] /api/v1/hotels/search
[GET] /api/v1/gourmets [GET] /api/v1/gourmets/{gourmet_id} ・ ・ ・ ルーティング追加して、 コントローラー追加して、 ビュー追加して・・・ [POST] /graphql スキーマとフィールド更新のみ ×
• 各サイトの詳細ページに周辺施設情報の要素追加したい 画面仕様変更への対応 仕様変更 29
• REST APIの場合 • バックエンド • 対象エンドポイントのレスポンスに要素追加 or エンドポイント追加 •
フロントエンド • 新規要素表示 • エンドポイント追加の場合は新たに呼び出し追加 各サイトの詳細ページに周辺施設情報の要素追加したい 仕様変更 30
• GraphQLの場合 • バックエンド • スキーマとフィールド更新 • フロントエンド • 新規要素表示
• クエリに新規で追加する要素を追記 各サイトの詳細ページに周辺施設情報の要素追加したい 仕様変更 31
追加の場合はあまり工数的にかわらなそう🤔 各サイトの詳細ページに周辺施設情報の要素追加したい 仕様変更 32
• REST APIの場合 • バックエンド • 対象のエンドポイントのレスポンスから削除 or エンドポイント追加 •
フロントエンド • 要素削除 各サイトの詳細ページに周辺施設情報の要素削除したい 仕様変更 33
各サイトの詳細ページに周辺施設情報の要素削除したい 仕様変更 34 • GraphQLの場合 • バックエンド • そのまま •
フロントエンド • 要素削除
各サイトの詳細ページに周辺施設情報の要素削除したい 仕様変更 35 • 要素削除の場合はフロントエンドの修正だけでいける • バックエンドは対象の要素をクエリで指定されない限り、その要素を 取得する処理は走らないため無駄が出ない
1.なぜREST APIからGraphQLに変更したのか 2.GraphQL化して見えたこと • 光 • エンドポイント • 仕様変更 •
影 • N+1 • エラーハンドリンク • ログ解析 今日お伝えすること 36
• スキーマ毎にクエリが走る associationが適切なタイミングでeager loadされていない N+1 37
• loadの該当fieldを要求されたときだけeager loadが走り、事 後でWHERE INされる graphql-batchを導入 N+1 38
• フロントエンドでレスポンスステータスによるエラーハンドリ ングができない GraphQLは常にレスポンスステータス200を返却する エラーハンドリング 39 ×
• catchの中でerror関数を呼ぶ レスポンスステータスによるエラーハンドリングは行わない エラーハンドリング 40
• エンポイントが単一なため全て request_uri: /graphql • レスポンス速度の調査などで問題箇所の洗い出しが困難 リクエストパス毎の解析ができない ログ解析 41
• リクエストボディ毎に分けることで呼び出し箇所の分類できる • レスポンス速度などに問題がある箇所の特定できる リクエストボディまでログに出力する ログ解析 42
まとめ 43
• エンドポイントを極力増やしたくない ◦ 同じ情報を複数サービスで使い回す場合に有効 • 工数削減 ◦ 画面要件が頻繁に変わるサービスでは効果高い 44 ୡ
ୡ
45