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

スペースマーケットにおけるマイクロサービスの取り組み

chato
March 26, 2021

 スペースマーケットにおけるマイクロサービスの取り組み

【GraphQL/Fargate...】シェアリングエコノミーを支えるアーキテクチャ
SPACEMARKET x Lancers Engineer Meetup #1
にて発表した資料です。

chato

March 26, 2021
Tweet

More Decks by chato

Other Decks in Technology

Transcript

  1. 11 ちなみに API以外の話(バッチ部分)については結構サービスが別れている • マーケティング系バッチ(3システム) : Rails • 検索系バッチ(5システム) :

    Go / Rails • 検索アルゴリズム: <secret> • 予約系バッチ(2システム) : Go • その他バッチ(2システム) : Rails
  2. 13 マイクロサービス 対応の歴史(第1段検索編) 叩くGraphQL毎にエンドポイントが違うのは辛いので Gatewayを設置 ・Schema Stitching で 複数のリモートスキーマ を1つのスキーマとして扱う

    ・実験段階ではRubyで作ってみたがいろいろ頑 張ってみたが性能がうまく出ず ・Node.jsで作ったところあっさり解決 Ruby: Blocking-IO Node: Non-Blocking IO Gatewayの特性上Node.jsの方が適性 ・RESTはGateway経由せず
  3. 16 マイクロサービス 対応の歴史(第2段予約・決済編) Mainサービスから予約部分を切り出すためには 2つのAPI結果をマージする必要があった 欲しい予約のレスポンス
 {
 id : 1


    status: 予約完了
 price: 20000円
 room_id : 100
 room: {
   部屋の名前: 普通の部屋
   部屋の説明: 素敵な部屋です。
  }
 }
 
    Room情報
 予約情報
 mainが返せる部屋レスポンス 
 room: {
  部屋の名前: 普通の部屋 
  部屋の説明: 素敵な部屋です。 
 }
 
    mainは予約情報は 持っていない
 予約が返せる部屋レスポンス 
 {
 id : 1
 status: 予約完了
 price: 20000円
 room_id : 100
 }
    予約サービスは 
 部屋の情報を持っ ていない

  4. 18 マイクロサービス 対応の歴史(第2段予約・決済編) 「Schema Stitching」 • 第1段(検索マイクロサービス )の際に取り入れたSchema Stitchingだが、単純に複数システムの スキーマをまとめるだけの機能として使っていた

    • なので1つのリクエストの中に複数のサービスの内容を含めることはできなかった • 複数のシステムが持った情報について例えば予約情報欲しい、スペース情報が欲しい を2リクエ ストとして返却はできるが、1つとして返却することはできなかった • もちろん各システムの前段にある Gatewayにて1つとして扱うようにコードを追加する。具体的には Gatewayにて予約の中にはスペース情報をマージする と言うコードを記載すれば可能であるが、 複数を1つにまとめる と言うことをする時に gatewayを改修する必要がある • さらにはすでにSchema Stichingはduplicatedになっていた
  5. 19 マイクロサービス 対応の歴史(第2段予約・決済編) 「Apollo Federation」 • 複数のシステムが持った情報について例えば予約情報欲しい、予約情報の中にはスペース情報 があるので一緒に欲しい 1つのレスポンスとして返却 することが可能

    • 2つ(もしくは複数)のGraphQL結果をまとめる時に Gatewayを直すのではなく、Gatewayにぶら下 がる各サービスのGraphQL定義を修正する • たとえば、予約のレスポンスに予約とは異なるサービスの room情報を含めたいのであれば予約 のフィールドにはroomがある、そしてroomは別サービスで定義されている。別サービスに Room情 報を問い合わせる時は予約の room_idを用いて引いてきて欲しい。といった記載を予約サービス 側にする。 • 一方でMainサービスでは別サービスからは RoomIDが渡ってくる、そして外部から呼び出した際に 部屋情報を引いてくるというコードを記載する
  6. 20 マイクロサービス 対応の歴史(第2段予約・決済編) 欲しい予約のレスポンス 
 {
 id : 1
 status:

    予約完了
 price: 20000円
 room_id : 100
 room: {
   部屋の名前: 普通の部屋 
   部屋の説明: 素敵な部屋です。 
  }
 }
 
    Room情報
 予約情報
 詳細はGraphQLとマイクロサービスは相性が良さそうな件 〜Apollo Federationを用いたスキーママージについて〜 https://blog.spacemarket.com/code/graphql-apollo-federation/ 合成するものを増やす場合でもGatewayは触らず、 
 個々のサービスに記載を増やす 
 「Apollo Federation」
  7. 21 マイクロサービス 対応の歴史(第2段予約・決済編) REST側はどうしているのか? -> 自前で似たようなことをしている 欲しい予約のレスポンス
 {
 id :

    1
 status: 予約完了
 price: 20000円
 room_id : 100
 room: {
   部屋の名前: 普通の部屋
   部屋の説明: 素敵な部屋です。
  }
 }
 
    Room情報
 予約情報
 mainが返せる部屋レスポンス 
 room: {
  部屋の名前: 普通の部屋 
  部屋の説明: 素敵な部屋です。 
 }
 
    予約が返せる部屋レスポンス 
 {
 id : 1
 status: 予約完了
 price: 20000円
 room_id : 100
  __extend_resource: [{ 
 resource: “Room”, 
 size: “single_default 
 key: 100
 option_params: {}
 merge_params: {}
 }]
 }
    __extend_resourceというレスポンスが含まれている場合 は 該当リソースを別サービスから取得してレスポンス をgatewayでマージする
 ただし、新規エンドポイントやリソースが増えた場合は Gatewayの改修も必要
 (apollo gateway, federation がやっていることを自前で やるので)

  8. 22 スペースマーケットにおけるマイクロサービスの現状とこれから 良かったこと • システムの規模が小さくなったことでバージョンアップがやりやすくなった • 改修する時の領域が明確になった (予約を直したいなら予約・決済システムを直せば良 い) •

    単体テストがとても早くなった (当時は1時間近くかかっていたものが10分未満になった。 分割した時に見直したと言う点も大きい ) • 弊社では今後Rails -> Node.jsに移行しようとしていますが、その時に一部だけ切り出す ことができる土台ができた 課題 • サービス間通信をしたいけどまだできていない • DBを分けていない部分があるので DBスキーマ変更はMAINで行うなどちょっと変な点が ある                       などなど 課題もまだまだある