Upgrade to Pro — share decks privately, control downloads, hide ads and more …

検索のMicroservices化 with Apollo Server

Avatar for roolrool roolrool
December 07, 2018

検索のMicroservices化 with Apollo Server

Avatar for roolrool

roolrool

December 07, 2018
Tweet

More Decks by roolrool

Other Decks in Technology

Transcript

  1. 2 自己紹介 Ryosuke Yamamoto ( @roolrool ) よちよちWebバックエンドエンジニアです。 男子シンクロのインストラクター、 Webディレクターを経て2017

    年1月にスペースマーケットにジョイン。 直近では新規事業やリニューアル PJを担当。 開発比率:Webバックエンド 9:1 Webフロント
  2. 15 検索用DBの作成 • 検索結果に必要なデータだけを持つテーブルを作成 ◦ スペース、空き情報、お気に入りなど • 新規検索機能に答えられる設計 ◦ 正確な空き時間検索など

    • 発行クエリ数やjoinを最小限に抑えられる設計 • スケーラブルなシステム ◦ Amazon Auroraを採用 ▪ AutoScale・Reader Endpointによる読み込みの負荷分散 方針
  3. 17 GraphQL API • GraphQL Server:Apollo Server • HTTP Server:Express

    • クエリビルダー:knex.js • 言語:TypeScript 技術スタック
  4. 19 Apollo Server • Apollo Client ◦ React.jsやVue.jsなどのframeworkで使用するGraphQL Client ◦

    弊社の各クライアントサイドでも使用 • Apollo Server ◦ ExpressにアドオンするGraphQL Server ◦ 今回初使用 • Apollo Engine ◦ Apollo Serverのモニタリング、パフォーマンス計測 ApolloプロジェクトのOSS
  5. 20 Apollo Server • ユニバーサルJSの流れ • 公式ドキュメントが充実 • APIドキュメントを自動生成 ◦

    GraphiQL的なもの • playgroundが便利 • Apollo Clientとの親和性が高い ◦ バッチリクエストなど • Apollo Engineでモニタリングが容易 Why Apollo Server Why
  6. 24 Apollo Server • Object TypeやEnum Typeなどのスキーマ定義 • 記述方式は通常のGraphQL schema

    language • 今回のリニューアルでは参照のみ( Mutationなし) スキーマ定義
  7. 31 Apollo Server • ユーザー認証のタイミング ◦ リクエスト時にtokenが渡った場合はRDSに問い合わせ、有効ならユーザー情報を ひく ▪ Apollo

    Serverをnewする際のcontext引数にユーザー情報を渡す ▪ 今考えると当然、でもその時はちょっと悩んだ思い出 • ディレクトリ設計/ファイル分割単位 ◦ resolver内は重くなりがちな印象 ▪ 各schema定義、各resolver、各modelは分けた方がよさそう ▪ 情報が少ないので、あるべきは自分たちで考えないといけない 実装時の個人的お悩みポイント
  8. 33 knex.js knex.jsとは • JavaScriptベースのSQLクエリビルダー ◦ resolver内でのDBアクセス時に使用 • メソッドチェーンで直感的にSQLを組むことができる •

    インターフェースとしてはコールバックや Promiseなど • トランザクション処理もサポート • コネクションプーリング • Rails同様のmigration機能 ◦ 今回は使用せず