Slide 1

Slide 1 text

Copyright hacomono Inc. All Rights Reserved. Rails x モジュラーモノリス 株式会社hacomono

Slide 2

Slide 2 text

2 Copyright hacomono Inc. All Rights Reserved. 志賀 誠(まこたす) Makoto Shiga / twitter: @maco_tasu 株式会社hacomono Engineer, プラットフォーム部所属 古くから動いているシステムのリプレース作業が好き プライベート: FPS / バイク / 犬 自己紹介

Slide 3

Slide 3 text

3 Copyright hacomono Inc. All Rights Reserved. 経歴紹介など 2013.4 株式会社カヤックに新卒で入社 ソシャゲのバックエンド開発 /運用 2015.12 株式会社アニメイトラボ アニメ配信サービス オウンドメディアのECS化 2017.8 freee株式会社 マイクロサービス共通モジュール作成 認証認可リプレース担当 2022.8 株式会社hacomono 開発 /基盤/プラットフォーム

Slide 4

Slide 4 text

hacomonoについて

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

プラットフォーム チームの紹介

Slide 14

Slide 14 text

14 Copyright hacomono Inc. All Rights Reserved. 開発組織 開発組織および基盤の 体制 プラットフォーム QA SRE IoT 機能開発チーム2 (エンプラ) 機能開発チーム1 (スクール) 機能開発チーム3 (POS) PdM/PMM UI/UX デザイナー CTO 工藤 VPoE VPoPE 矢嶋 イネーブリング

Slide 15

Slide 15 text

15 Copyright hacomono Inc. All Rights Reserved. プラットフォームチームとは チーム紹介 プロダクト開発チームが価値を提供する上で、必要なモノ (共通機能、知識等)を整えるチーム

Slide 16

Slide 16 text

今日お話する内容

Slide 17

Slide 17 text

17 Copyright hacomono Inc. All Rights Reserved. お話すること テーマ ● モジュラーモノリス導入に至った背景 ● 導入に向けて利用した技術の紹介

Slide 18

Slide 18 text

モジュラーモノリス導入に至るまで 口座振替

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

20 Copyright hacomono Inc. All Rights Reserved. これまでのhacomono モジュラーモノリス導入に至るまで hacomono app 予約 入退館 レジ メール 各マスタ … 2022/04 ~ team1 team2 team3

Slide 21

Slide 21 text

21 Copyright hacomono Inc. All Rights Reserved. これまでのhacomono モジュラーモノリス導入に至るまで 開発人数 20xx年 2018年 リリース 自由予約 スクール SSO xx制限 予約キャンセル待ち 年会費 ロールレベルカスタマイズ 口座振替 POS OIDC ライセンス編集 etc…

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

23 Copyright hacomono Inc. All Rights Reserved. 達成したいこと モジュラーモノリス導入に至るまで 人が増えてチームが分割されても これまでの生産性を維持したい それぞれの領域について 知識と実装面で分離できる仕組みをつくる

Slide 24

Slide 24 text

24 Copyright hacomono Inc. All Rights Reserved. イメージ モジュラーモノリス導入に至るまで hacomono サービス team1 機能A 機能B 機能C 機能D team2 team3

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

26 Copyright hacomono Inc. All Rights Reserved. モジュラーモノリス or マイクロサービス モジュラーモノリス導入に至るまで ● モジュラーモノリスを選択 ○ 成長に合わせてモジュール/モデルの見直しが発 生しそう ○ 価値を早く顧客に届けたい

Slide 27

Slide 27 text

モジュラーモノリスの実現 口座振替

Slide 28

Slide 28 text

28 Copyright hacomono Inc. All Rights Reserved. Railsでモジュラーモノリスに向けた境界をどうやってわけるか モジュラーモノリスの実現 ● 各モジュール間でコード上の境界を持つ方法 ○ Rubyなので越境が簡単 ● 各モジュールが扱う永続仮想化層の境界分け ○ ActiveRecordが強力

Slide 29

Slide 29 text

29 Copyright hacomono Inc. All Rights Reserved. Railsでモジュラーモノリスに向けた境界をどうやってわけるか モジュラーモノリスの実現 https://github.com/Shopify/packwerk

Slide 30

Slide 30 text

30 Copyright hacomono Inc. All Rights Reserved. 取り組み1: packwerkとは モジュラーモノリスの実現 hacomono app packages 予約 … メール配信 入退館 顧客管理 … pkg pkg pkg ➔ 機能を論理的分離(pkg = package) ➔ pkgが意図せぬ依存がないかを、 pkg内 のnamespaceをもとに静的解析できる ➔ pkg毎にcodeowner設定 概要

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

32 Copyright hacomono Inc. All Rights Reserved. 取り組み2: 外部APIはprotoを活用 モジュラーモノリスの実現 hacomono app packages 予約 … メール配信 入退館 顧客管理 … proto proto proto ➔ pkgのEntryPointは、proto定義から生 成されたRubyコードを用いる ➔ 将来的にpkgがマイクロサービスとなっ た際を考慮

Slide 33

Slide 33 text

33 Copyright hacomono Inc. All Rights Reserved. 取り組み2: 外部APIはprotoを活用 モジュラーモノリスの実現 https://github.com/grpc/grpc/src/ruby/tools/bin/grpc _tools_ruby_protoc

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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を活用 モジュラーモノリスの実現

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

37 Copyright hacomono Inc. All Rights Reserved. 取り組み3: 永続化層への制限 モジュラーモノリスの実現 hacomono app packages 予約 … メール配信 入退館 顧客管理 … proto proto proto pkgアクセスするタイミングで、 Thread.currentに許可テーブルを設定 DB ARProxyのpluginとして QueryObserverを実行 Thread.currentの許可テーブルとSQL を比較・チェック

Slide 38

Slide 38 text

38 Copyright hacomono Inc. All Rights Reserved. 取り組み4: 細かい開発体験向上 モジュラーモノリスの実現 bundle exec rails g hacoway {module} --module=true

Slide 39

Slide 39 text

39 Copyright hacomono Inc. All Rights Reserved. 共に戦う戦士たちを募集中 お客様に 「WOW!」を届ける基盤づくりに ご興味がある方いましたら選考のご応募をお待ちしております。            RECRUIT hacomono Entrance Book