Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
検索のMicroservices化 with Apollo Server
Search
roolrool
December 07, 2018
Technology
2
1.7k
検索のMicroservices化 with Apollo Server
roolrool
December 07, 2018
Tweet
Share
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
Debugging Edge AI on Zephyr and Lessons Learned
iotengineer22
0
220
Jakarta Agentic AI Specification - Status and Future
reza_rahman
0
110
MLflowで始めるプロンプト管理、評価、最適化
databricksjapan
1
250
AWS Security Agentの紹介/introducing-aws-security-agent
tomoki10
0
300
NIKKEI Tech Talk #41: セキュア・バイ・デザインからクラウド管理を考える
sekido
PRO
0
120
モダンデータスタック (MDS) の話とデータ分析が起こすビジネス変革
sutotakeshi
0
500
新 Security HubがついにGA!仕組みや料金を深堀り #AWSreInvent #regrowth / AWS Security Hub Advanced GA
masahirokawahara
1
2.1k
CARTAのAI CoE が挑む「事業を進化させる AI エンジニアリング」 / carta ai coe evolution business ai engineering
carta_engineering
0
1.9k
AI 駆動開発勉強会 フロントエンド支部 #1 w/あずもば
1ftseabass
PRO
0
400
AIプラットフォームにおけるMLflowの利用について
lycorptech_jp
PRO
1
170
mairuでつくるクレデンシャルレス開発環境 / Credential-less development environment using Mailru
mirakui
5
540
評価駆動開発で不確実性を制御する - MLflow 3が支えるエージェント開発
databricksjapan
1
210
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Automating Front-end Workflow
addyosmani
1371
200k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
710
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
How to train your dragon (web standard)
notwaldorf
97
6.4k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.3k
Optimizing for Happiness
mojombo
379
70k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
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