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

Rails x モジュラーモノリス

Rails x モジュラーモノリス

https://timeedev.connpass.com/event/295654/

hacomonoセッション
「モノリスなRailsにモジュラーモノリスを導入した話」

株式会社hacomono 志賀誠(macotasu)

hacomono Inc.

October 04, 2023
Tweet

More Decks by hacomono Inc.

Other Decks in Programming

Transcript

  1. 2 Copyright hacomono Inc. All Rights Reserved. 志賀 誠(まこたす) Makoto

    Shiga / twitter: @maco_tasu 株式会社hacomono Engineer, プラットフォーム部所属 古くから動いているシステムのリプレース作業が好き プライベート: FPS / バイク / 犬 自己紹介
  2. 3 Copyright hacomono Inc. All Rights Reserved. 経歴紹介など 2013.4 株式会社カヤックに新卒で入社

    ソシャゲのバックエンド開発 /運用 2015.12 株式会社アニメイトラボ アニメ配信サービス オウンドメディアのECS化 2017.8 freee株式会社 マイクロサービス共通モジュール作成 認証認可リプレース担当 2022.8 株式会社hacomono 開発 /基盤/プラットフォーム
  3. 14 Copyright hacomono Inc. All Rights Reserved. 開発組織 開発組織および基盤の 体制

    プラットフォーム QA SRE IoT 機能開発チーム2 (エンプラ) 機能開発チーム1 (スクール) 機能開発チーム3 (POS) PdM/PMM UI/UX デザイナー CTO 工藤 VPoE VPoPE 矢嶋 イネーブリング
  4. 17 Copyright hacomono Inc. All Rights Reserved. お話すること テーマ •

    モジュラーモノリス導入に至った背景 • 導入に向けて利用した技術の紹介
  5. 19 Copyright hacomono Inc. All Rights Reserved. これまでのhacomono モジュラーモノリス導入に至るまで hacomono

    app 予約 入退館 レジ メール 各マスタ … ➔ 内部的にはCleanArchitectureで、一定のルール がある ➔ 各機能同士が好きなメソッド自由に呼び出せる ➔ 機能間で結合度が高い状態 All Engineers
  6. 21 Copyright hacomono Inc. All Rights Reserved. これまでのhacomono モジュラーモノリス導入に至るまで 開発人数

    20xx年 2018年 リリース 自由予約 スクール SSO xx制限 予約キャンセル待ち 年会費 ロールレベルカスタマイズ 口座振替 POS OIDC ライセンス編集 etc…
  7. 22 Copyright hacomono Inc. All Rights Reserved. hacomono appに起こりうる課題 /

    イベント モジュラーモノリス導入に至るまで hacomono app 予約 入退館 レジ メール 各マスタ … ➔ チーム間のコンフリクト ◆ e.g. xx機能を修正した場合の影響は?正しい 仕様はなにか? ➔ ドメインの成長 ◆ 専用チーム誕生 ◆ hacomono本体からの分離 ➔ 新サービス誕生 ◆ hacomonoから共通機能を分離 ➔ etc…
  8. 23 Copyright hacomono Inc. All Rights Reserved. 達成したいこと モジュラーモノリス導入に至るまで 人が増えてチームが分割されても

    これまでの生産性を維持したい それぞれの領域について 知識と実装面で分離できる仕組みをつくる
  9. 25 Copyright hacomono Inc. All Rights Reserved. モジュラーモノリス or マイクロサービス

    モジュラーモノリス導入に至るまで hacomono app モジュラーモノリス 物理イメージ … … モジュールA モジュールC … モジュールB … モジュールD hacomono app マイクロサービス 物理イメージ サービスA サービスB サービスC
  10. 26 Copyright hacomono Inc. All Rights Reserved. モジュラーモノリス or マイクロサービス

    モジュラーモノリス導入に至るまで • モジュラーモノリスを選択 ◦ 成長に合わせてモジュール/モデルの見直しが発 生しそう ◦ 価値を早く顧客に届けたい
  11. 28 Copyright hacomono Inc. All Rights Reserved. Railsでモジュラーモノリスに向けた境界をどうやってわけるか モジュラーモノリスの実現 •

    各モジュール間でコード上の境界を持つ方法 ◦ Rubyなので越境が簡単 • 各モジュールが扱う永続仮想化層の境界分け ◦ ActiveRecordが強力
  12. 30 Copyright hacomono Inc. All Rights Reserved. 取り組み1: packwerkとは モジュラーモノリスの実現

    hacomono app packages 予約 … メール配信 入退館 顧客管理 … pkg pkg pkg ➔ 機能を論理的分離(pkg = package) ➔ pkgが意図せぬ依存がないかを、 pkg内 のnamespaceをもとに静的解析できる ➔ pkg毎にcodeowner設定 概要
  13. 31 Copyright hacomono Inc. All Rights Reserved. bundle exec packwerk

    check 取り組み1: package毎にルールをymlで定義できる モジュラーモノリスの実現 • pkgが外部APIとして許可するEntryPoint • pkgが依存できるpkgの定義 • pkgが一時的に依存するnamespace • pkgのステータス(開発中か公開済みか) • etc…
  14. 32 Copyright hacomono Inc. All Rights Reserved. 取り組み2: 外部APIはprotoを活用 モジュラーモノリスの実現

    hacomono app packages 予約 … メール配信 入退館 顧客管理 … proto proto proto ➔ pkgのEntryPointは、proto定義から生 成されたRubyコードを用いる ➔ 将来的にpkgがマイクロサービスとなっ た際を考慮
  15. 34 Copyright hacomono Inc. All Rights Reserved. # mailer.protoファイル package

    mailer; service MailService { rpc GetMail(GetMailRequest) return (GetMailResponse) {} } 取り組み2: 外部APIはprotoを活用 モジュラーモノリスの実現 grpc_tools_ruby_protoc mailer_pb.rb mailer_service_pb.rb
  16. 35 Copyright hacomono Inc. All Rights Reserved. class GetMail <

    ::Mailer::MailService::Service # @param [GetMailRequest] input # @return [GetMailResponse] def execute(input:) # rpc_desc イメージ # { # GetMail: { # input: GetMailRequest # output: GetMailResponse # } # } rpc_desc_details = rpc_desc[name.to_sym] raise 'リクエストの型がおかしい ' unless input.is_a? rpc_desc_details[:input] output = # メール情報を取得 raise 'アウトプットの型がおかしい ' unless output.is_a? rpc_desc_details[:output] output end end 取り組み2: 外部APIはprotoを活用 モジュラーモノリスの実現
  17. 36 Copyright hacomono Inc. All Rights Reserved. 取り組み3: 永続化層への制限 モジュラーモノリスの実現

    • ActiveRecord, Arelと自由な書き方ができるため、そ の層で正確に弾くのは厳しい • ARProxyで検知 ◦ https://github.com/cookpad/arproxy
  18. 37 Copyright hacomono Inc. All Rights Reserved. 取り組み3: 永続化層への制限 モジュラーモノリスの実現

    hacomono app packages 予約 … メール配信 入退館 顧客管理 … proto proto proto pkgアクセスするタイミングで、 Thread.currentに許可テーブルを設定 DB ARProxyのpluginとして QueryObserverを実行 Thread.currentの許可テーブルとSQL を比較・チェック
  19. 39 Copyright hacomono Inc. All Rights Reserved. 共に戦う戦士たちを募集中 お客様に 「WOW!」を届ける基盤づくりに

    ご興味がある方いましたら選考のご応募をお待ちしております。            RECRUIT hacomono Entrance Book