SlideShare a Scribd company logo
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 EC2ELB
サブドメインで
3サイトを同一インスタンスに搭載
フロントエンド バックエンド
構成
15
Amazon EC2 Amazon EC2ELB
サブドメインで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

More Related Content

PDF
クラウド時代だからこそ見直したい
PHPアプリケーションのパフォーマンスチューニング
PDF
R○Sに学ぶイマドキのMySQL構築運用
PDF
Multi Cloud Design Pattern(Beta)
PDF
私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜
PPTX
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
PPTX
イノベーションエッグLt資料
PDF
PIXTAにおけるCloudSearchのコスト削減
PDF
20150207 サービス紹介編 Amazon Simple Queue Service (SQS)
クラウド時代だからこそ見直したい
PHPアプリケーションのパフォーマンスチューニング
R○Sに学ぶイマドキのMySQL構築運用
Multi Cloud Design Pattern(Beta)
私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
イノベーションエッグLt資料
PIXTAにおけるCloudSearchのコスト削減
20150207 サービス紹介編 Amazon Simple Queue Service (SQS)

What's hot (20)

PPTX
Xamarin + Azure Mobile Appsの現実
PDF
「サーバレスの薄い本」からの1年 #serverlesstokyo
PDF
サバ缶のない世界でスカイアーチはこの先生きのこれるのか考える
PDF
モバイルゲームにおけるAWSの泥臭い使い方
PDF
クラウドとコミュニティのこれまでとこれから 20150322_#JAWSDAYS
PPTX
Moderator Slide for Global Azure Bootcamp 2019@Sapporo
PDF
JAWS DAYS 2015
PDF
DevLove Kansai AWS
PDF
BluetoothメッシュによるIoTシステムを支えるサーバーレス技術 #serverlesstokyo
PDF
グラフ解析で社長の脳内さらす!
PDF
現場で使えるDynamoDBと冪等デザインパターン
PDF
サーバーレスでシステムを開発する時に⼤切な事
PDF
PDF
AWS re:Inventに行くために今日からやるべき3つのこと
PDF
jaws-ug kansai-special_kinesis_20150207
PDF
20141017 あなたのword pressに捧げる3つの法要
PPTX
Asp.netとbluemixで遊んでみたお話
PPTX
懲りずにazure functionsでlinebotを作ってみた
PDF
AWS ロボ in JAWSDAYS
PDF
Jawsug osaka10 service&regions
Xamarin + Azure Mobile Appsの現実
「サーバレスの薄い本」からの1年 #serverlesstokyo
サバ缶のない世界でスカイアーチはこの先生きのこれるのか考える
モバイルゲームにおけるAWSの泥臭い使い方
クラウドとコミュニティのこれまでとこれから 20150322_#JAWSDAYS
Moderator Slide for Global Azure Bootcamp 2019@Sapporo
JAWS DAYS 2015
DevLove Kansai AWS
BluetoothメッシュによるIoTシステムを支えるサーバーレス技術 #serverlesstokyo
グラフ解析で社長の脳内さらす!
現場で使えるDynamoDBと冪等デザインパターン
サーバーレスでシステムを開発する時に⼤切な事
AWS re:Inventに行くために今日からやるべき3つのこと
jaws-ug kansai-special_kinesis_20150207
20141017 あなたのword pressに捧げる3つの法要
Asp.netとbluemixで遊んでみたお話
懲りずにazure functionsでlinebotを作ってみた
AWS ロボ in JAWSDAYS
Jawsug osaka10 service&regions
Ad

Similar to NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影 (20)

PPTX
比較サイトの検索改善(SPA から SSR に変換)
PDF
Staticwp 20131013
PDF
サブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in express
PPTX
Fluxflex meetup 2011 in Tokyo
PDF
俺とAngular JS 2
PDF
トレジャーデータ 導入体験記 リブセンス編
PDF
GraphQLはどんな時に使うか
PDF
我が家のフロントエンド開発事情
PPTX
fluxflex meetup in Tokyo
PDF
JJUG CCC リクルートの Java に対する取り組み
PPTX
20170510 タウンwi fixlifull_スマホアプリ開発の実例 (1)
PPTX
Visualize terms network in Lucene index
PPTX
Life and how_to_live_it
PDF
UnityとAmazon Web Servicesで生み出す新しい価値
PPTX
Ruby on Rails on Azure
PDF
【kintone café松江#1】kintoneの可能性
PDF
S14 t3 yosuke_yamashita
PDF
About rails 3
PDF
SADAO TOKUYAMA の L.E.A.P カンファレンス な 話
PPT
広島Ruby勉強会#35プレゼン
比較サイトの検索改善(SPA から SSR に変換)
Staticwp 20131013
サブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in express
Fluxflex meetup 2011 in Tokyo
俺とAngular JS 2
トレジャーデータ 導入体験記 リブセンス編
GraphQLはどんな時に使うか
我が家のフロントエンド開発事情
fluxflex meetup in Tokyo
JJUG CCC リクルートの Java に対する取り組み
20170510 タウンwi fixlifull_スマホアプリ開発の実例 (1)
Visualize terms network in Lucene index
Life and how_to_live_it
UnityとAmazon Web Servicesで生み出す新しい価値
Ruby on Rails on Azure
【kintone café松江#1】kintoneの可能性
S14 t3 yosuke_yamashita
About rails 3
SADAO TOKUYAMA の L.E.A.P カンファレンス な 話
広島Ruby勉強会#35プレゼン
Ad

More from gree_tech (20)

PPTX
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
PDF
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
PPTX
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
PPTX
アプリ起動時間高速化 ~推測するな、計測せよ~
PPTX
長寿なゲーム事業におけるアプリビルドの効率化
PPTX
Cloud Spanner をより便利にする運用支援ツールの紹介
PPTX
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
PPTX
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
PPTX
海外展開と負荷試験
PPTX
翻訳QAでのテスト自動化の取り組み
PPTX
組み込み開発のテストとゲーム開発のテストの違い
PPTX
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
PPTX
データエンジニアとアナリストチーム兼務になった件について
PPTX
シェアドサービスとしてのデータテクノロジー
PPTX
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
PPTX
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
PPTX
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
PPTX
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
PPTX
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
PPTX
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
アプリ起動時間高速化 ~推測するな、計測せよ~
長寿なゲーム事業におけるアプリビルドの効率化
Cloud Spanner をより便利にする運用支援ツールの紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
海外展開と負荷試験
翻訳QAでのテスト自動化の取り組み
組み込み開発のテストとゲーム開発のテストの違い
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
データエンジニアとアナリストチーム兼務になった件について
シェアドサービスとしてのデータテクノロジー
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-

NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影