Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
540
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
変わるもの、変わらないもの :OSSアーキテクチャで実現する持続可能なシステム
gree_tech
PRO
0
1.4k
マネジメントに役立つ Google Cloud
gree_tech
PRO
0
24
今この時代に技術とどう向き合うべきか
gree_tech
PRO
3
2.3k
生成AIを開発組織にインストールするために: REALITYにおけるガバナンス・技術・文化へのアプローチ
gree_tech
PRO
0
130
安く・手軽に・現場発 既存資産を生かすSlack×AI検索Botの作り方
gree_tech
PRO
0
120
生成AIを安心して活用するために──「情報セキュリティガイドライン」策定とポイント
gree_tech
PRO
1
680
あうもんと学ぶGenAIOps
gree_tech
PRO
0
210
MVP開発における生成AIの活用と導入事例
gree_tech
PRO
0
230
機械学習・生成AIが拓く事業価値創出の最前線
gree_tech
PRO
0
170
Other Decks in Technology
See All in Technology
AI/MLのマルチテナント基盤を支えるコンテナ技術
pfn
PRO
4
320
useEffectってなんで非推奨みたいなこと言われてるの?
maguroalternative
9
5.5k
.NET 10 のパフォーマンス改善
nenonaninu
2
3.3k
"'TSのAPI型安全”の対価は誰が払う?不公平なスキーマ駆動に終止符を打つハイブリッド戦略
hal_spidernight
0
210
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.9k
あなたの知らないDateのひみつ / The Secret of "Date" You Haven't known #tqrk16
expajp
0
110
都市スケールAR制作で気をつけること
segur
0
210
私のRails開発環境
yahonda
0
170
AI エージェント活用のベストプラクティスと今後の課題
asei
2
420
AIで加速する次世代のBill Oneアーキテクチャ〜成長の先にある軌道修正〜
sansantech
PRO
1
150
ローカルVLM OCRモデル + Gemini 3.0 Proで日本語性能を試す
gotalab555
1
250
今すぐGoogle Antigravityを触りましょう
rfdnxbro
0
240
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.4k
A designer walks into a library…
pauljervisheath
210
24k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.4k
It's Worth the Effort
3n
187
29k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Docker and Python
trallard
46
3.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
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