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
検索のMicroservices化 with Apollo Server
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
roolrool
December 07, 2018
Technology
1.7k
2
Share
検索のMicroservices化 with Apollo Server
roolrool
December 07, 2018
More Decks by roolrool
See All by roolrool
本番環境のRailsプロダクトでGraphQL API / GraphQL API on Rails Products in Production
roolrool
1
1.7k
Other Decks in Technology
See All in Technology
NgRx SignalStore: The Power of Extensibility
rainerhahnekamp
0
190
会社紹介資料 / Sansan Company Profile
sansan33
PRO
16
410k
自己組織化を試される緑茶ハイを求めて、今日も全力であそんで学ぼう / Self-Organization and Shochu Green Tea
naitosatoshi
0
340
Cortex Codeでデータの仕事を全部Agenticにやりきろう!
gappy50
0
350
"まず試す"ためのDatabricks Apps活用法 / Databricks Apps for Early Experiments and Validation
nttcom
1
230
Zero-Downtime Migration: Moving a Massive, Historic iOS App from CocoaPods to SPM and Tuist without Stopping Feature Delivery
kagemiku
0
230
新メンバーのために、シニアエンジニアが環境を作る時代
puku0x
0
630
新規サービス開発におけるReact Nativeのリアル〜技術選定の裏側と実践的OSS活用〜
grandbig
2
180
すごいぞManaged Kubernetes
harukasakihara
1
390
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
4
14k
ふりかえりを 「あそび」にしたら、 学習が勝手に進んだ / Playful Retros Drive Learning
katoaz
0
440
さくらのAI Engineから始める クラウドネイティブ意識
melonps
0
130
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
520
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
510
Mind Mapping
helmedeiros
PRO
1
150
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
210
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
96
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Visualization
eitanlees
150
17k
Practical Orchestrator
shlominoach
191
11k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
870
Embracing the Ebb and Flow
colly
88
5k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
260
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
170
Transcript
スペース検索のMicroservices化 with Apollo Server 2018.12.6 Ryosuke Yamamoto
2 自己紹介 Ryosuke Yamamoto ( @roolrool ) よちよちWebバックエンドエンジニアです。 男子シンクロのインストラクター、 Webディレクターを経て2017
年1月にスペースマーケットにジョイン。 直近では新規事業やリニューアル PJを担当。 開発比率:Webバックエンド 9:1 Webフロント
3 改めまして、
4 先日サイトリニューアルしました!
5 before after トップ
6 before after スペース検索一覧
7 ではバックエンドは何がどう変わったのというお話。
8 アジェンダ • リニューアル概要 • 検索用DBの作成 • GraphQL APIの実装 ◦
Apollo Server ◦ knex.js ◦ TypeScript • まとめ
9 スペース検索のMicroservices化
10 リニューアル概要
11 旧全体図 スマートフォンアプリ REST/GraphQL Webフロント/サーバー クライアント API DB RDS for
MySQL
12 リニューアル後全体図 スマートフォンアプリ REST/GraphQL Webフロント/サーバー クライアント API DB RDS for
MySQL GraphQL Amazon Aurora
13 何をしたか • 検索用のキャッシュテーブルをRDS for MySQLからAmazon Auroraへ移行 • REST APIからGraphQL
APIへ移行 • Ruby on RailsからNode/Express/Apollo Serverへ移行 ポイント
14 検索用DBの作成
15 検索用DBの作成 • 検索結果に必要なデータだけを持つテーブルを作成 ◦ スペース、空き情報、お気に入りなど • 新規検索機能に答えられる設計 ◦ 正確な空き時間検索など
• 発行クエリ数やjoinを最小限に抑えられる設計 • スケーラブルなシステム ◦ Amazon Auroraを採用 ▪ AutoScale・Reader Endpointによる読み込みの負荷分散 方針
16 GraphQL API
17 GraphQL API • GraphQL Server:Apollo Server • HTTP Server:Express
• クエリビルダー:knex.js • 言語:TypeScript 技術スタック
18 Apollo Server
19 Apollo Server • Apollo Client ◦ React.jsやVue.jsなどのframeworkで使用するGraphQL Client ◦
弊社の各クライアントサイドでも使用 • Apollo Server ◦ ExpressにアドオンするGraphQL Server ◦ 今回初使用 • Apollo Engine ◦ Apollo Serverのモニタリング、パフォーマンス計測 ApolloプロジェクトのOSS
20 Apollo Server • ユニバーサルJSの流れ • 公式ドキュメントが充実 • APIドキュメントを自動生成 ◦
GraphiQL的なもの • playgroundが便利 • Apollo Clientとの親和性が高い ◦ バッチリクエストなど • Apollo Engineでモニタリングが容易 Why Apollo Server Why
21 Apollo Server - playground -
22 Apollo Engine
23 Apollo Server 少し解説 #server.ts
24 Apollo Server • Object TypeやEnum Typeなどのスキーマ定義 • 記述方式は通常のGraphQL schema
language • 今回のリニューアルでは参照のみ( Mutationなし) スキーマ定義
25 Apollo Server スキーマ定義(実装) • typeごとに分けてmerge
26 Apollo Server • 各プロパティごとにresolver内で解決した値を返す • スキーマ定義に記述した型で返す resolver
27 Apollo Server resolver(実装) • resolvers/index.tsを server.tsでimport • 処理が多いresolverは メソッドに切り出し
28 Apollo Server • 第三引数以降にオプションを設定可能 ◦ contextの受け渡し ◦ Apollo Engineの設定
◦ playgroundの有効化 Apollo Serverの初期化
29 Apollo Serverの初期化(実装) Apollo Server • 各resolversで使用するものは contextで受け渡し ◦ ログインユーザー
◦ DBコネクション • playgroundはdevelopmentのみ
30 Apollo Server • ExpressのミドルウェアにApollo Serverを追加 ◦ defaultでは`/graphql`にルーティングが作成される • listenするportを指定
Expressとの連携
31 Apollo Server • ユーザー認証のタイミング ◦ リクエスト時にtokenが渡った場合はRDSに問い合わせ、有効ならユーザー情報を ひく ▪ Apollo
Serverをnewする際のcontext引数にユーザー情報を渡す ▪ 今考えると当然、でもその時はちょっと悩んだ思い出 • ディレクトリ設計/ファイル分割単位 ◦ resolver内は重くなりがちな印象 ▪ 各schema定義、各resolver、各modelは分けた方がよさそう ▪ 情報が少ないので、あるべきは自分たちで考えないといけない 実装時の個人的お悩みポイント
32 knex.js
33 knex.js knex.jsとは • JavaScriptベースのSQLクエリビルダー ◦ resolver内でのDBアクセス時に使用 • メソッドチェーンで直感的にSQLを組むことができる •
インターフェースとしてはコールバックや Promiseなど • トランザクション処理もサポート • コネクションプーリング • Rails同様のmigration機能 ◦ 今回は使用せず
34 knex.js (例)
35 knex.js (例) _人人人人人人人人人人_ > わかりやすい!!<  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
36 knex.js 〜 O/Rマッパーに甘やかされた人間が救われた図 〜
37 TypeScript
38 TypeScript 使ってみて • JSのスーパーセットなので導入しやすい • VSCodeの補完が便利(interfaceの定義など) • Flowと違って型定義が必須なのがよい(必殺 anyという手も)
39 まとめ
40 • JavaScriptともっと仲良くなりたい
None