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

ソフトウェアにおける垂直設計と水平設計 ~モジュラーモノリスへ挑戦~

ソフトウェアにおける垂直設計と水平設計 ~モジュラーモノリスへ挑戦~

## 技術

モジュラーモノリス, マイクロサービス, TypeScript, gRPC, monorepo, turbopack

More Decks by レバレジーズTechアカウント

Other Decks in Technology

Transcript

  1. ソフトウェアにおける
    垂直設計と水平設計
    ~モジュラーモノリスへ挑戦~
    レバテック開発部 河村勇樹

    View full-size slide

  2. | © Leverages inc.
    2
    ● 所属:
    ○ レバテック開発部 テクニカルイネイブリンググループ
    ● 経歴:
    ○ 2019年4月 大手Web企業 新卒入社
    ○ 2021年1月 レバレジーズ株式会社 中途入社
    ● 出身:
    ○ 東京都町田市(シティボーイ)
    ● 趣味:
    ○ お酒、ゴルフ
    ● 2023年の目標:
    ○ ゴルフのスコアを90台80台にのせること
    ● 好きなAWSサービス:
    ○ Amplify、CloudFront、ECS、Aurora
    自己紹介
    Introduction

    View full-size slide

  3. | © Leverages inc.
    3
    ● 垂直と水平ってなに?
    ● ソフトウェアにおける垂直と水平
    ● モジュラーモノリスへ挑戦
    ● モジュラーモノリスを実践
    ● まとめ
    アジェンダ
    INDEX

    View full-size slide

  4. | © Leverages inc.
    4
    ● システム、ソフトウェアが「なにを軸に分割」
    されているのか意識(理解)できるようにな

    ● ディレクトリが「なにを軸に分割」しているの
    か意識(理解)できるようになる
    ● モジュラモノリスのテクニックをなんとなく理
    解できるようになる
    今日のゴール
    目的・目標

    View full-size slide

  5. 垂直と水平?

    View full-size slide

  6. 今日のお話、ググってもあまり出てこない?
    「水平分散システム」と「垂直分散システム」の違いとかはあるかも

    View full-size slide

  7. 縦と横って聞いてなにを想像しますか?

    View full-size slide

  8. ある対象を
    縦と横に分割することについて考える

    View full-size slide

  9. 人の場合で考えてみる

    View full-size slide

  10. 上半身?
    下半身?

    View full-size slide

  11. 左半身? 右半身?

    View full-size slide

  12. 観点を変えて

    View full-size slide

  13. 分身A? 分身B?

    View full-size slide

  14. 仕事 プライベート

    View full-size slide

  15. 役割ごとに
    分けることもできる

    View full-size slide

  16. 組織で考えてみる

    View full-size slide

  17. 営業 開発

    View full-size slide

  18. 給与管理
    勤怠管理

    View full-size slide

  19. 縦を”役割”で分割
    横を”機能”で分割

    View full-size slide

  20. システムで考えてみる

    View full-size slide

  21. スケーラビリティ(分散)
    を目的としてみよう

    View full-size slide

  22. 水平に分散

    View full-size slide

  23. 水平に分散

    View full-size slide

  24. 垂直に分散

    View full-size slide

  25. 垂直に分散
    マシンのスペックを向上させること
    つまり、CPUやRAMを増やすこと
    縦の能力を伸ばすこと

    View full-size slide

  26. 垂直スケーラビリティ
    水平スケーラビリティ
    一般的に言うと

    View full-size slide

  27. | © Leverages inc.
    37
    ● 物事を目的に応じて、
    ○ 垂直(縦)と水平(横)で分割
    ● そうすることで、
    ○ 目的に応じた設計ができるようにな

    ○ なにを目的としているのかわかりや
    すくなる
    垂直と水平
    まとめ

    View full-size slide

  28. ソフトウェアにおける垂直と水平

    View full-size slide

  29. ソフトウェア
    モジュール

    View full-size slide

  30. ソフトウェア
    モジュール

    View full-size slide

  31. 水平を”責務”で分割

    View full-size slide

  32. ソフトウェア
    モジュール
    UIモジュール
    データモジュール

    View full-size slide

  33. ソフトウェア
    モジュール
    View
    Controller
    Model

    View full-size slide

  34. ソフトウェア
    モジュール
    Presentation
    Application
    Domain
    Infrastructure

    View full-size slide

  35. レイヤードアーキテクチャ
    エンジニアの関心ごとで分割するのはやりやすい?

    View full-size slide

  36. ソフトウェア
    モジュール

    View full-size slide

  37. 垂直に”機能”で分割

    View full-size slide

  38. ソフトウェア
    案件モジュール 人材モジュール

    View full-size slide

  39. ソフトウェア
    人材モジュール 人材モジュール
    ソフトウェア
    案件モジュール

    View full-size slide

  40. | © Leverages inc.
    50
    ● ソフトウェアを”機能”で分割ってなにを軸に分割すればいいのだろうか
    ○ サービス単位?
    ○ 画面単位?
    ○ データ単位?
    ● 安易に分割すると逆に密結合になってしまう
    ○ モジュールを分割してしまうと逆に複雑性が増すこともある
    ■ それこそ循環参照みたいな状態になってしまったらより複雑になる
    ○ ソフトウェアレベルで分割するとアンチパターンに陥る
    ■ 分散されたモノリスになってしまうマイクロサービス
    ● では、どうやって分割するのか?
    ○ ドメイン分析?
    ○ 境界づけられたコンテキスト?
    ○ コンポーネントの特定およびサイズ調整?
    ソフトウェアを”機能”で分割するのは難しい
    TOPIC

    View full-size slide

  41. ”機能”で分割するには
    相当なテクニックがいる
    そのためにいろんな手法が存在している
    ※ このテクニックについては本日は割愛

    View full-size slide

  42. ソフトウェアアーキテクチャ・ハードパーツ
    ―分散アーキテクチャのためのトレードオフ分析
    エリック・エヴァンスのドメイン駆動設計 マイクロサービスアーキテクチャ 第2版

    View full-size slide

  43. ソフトウェアも垂直と水平に分
    割することができる
    話を戻すと...

    View full-size slide

  44. | © Leverages inc.
    54
    ● 目的に応じた設計ができるようになる
    ○ どのクラスをどこに配置すればいいのか明確になる
    ○ 分割対象ではどのようなことを意識すればいいのか明確になる
    ● 1つの分割対象に対する認知負荷やコストを下げることができる
    ○ レイヤードアーキテクチャの Presentation層ではUIに関することを意識すればよい
    ○ 案件モジュールでは案件に関することを意識すればよい
    ● XXX性が向上する
    ○ 独立性、保守性、可用性、信頼性、拡張性、 ...
    ソフトウェアを垂直と水平に分割するメリット
    TOPIC

    View full-size slide

  45. | © Leverages inc.
    55
    ● アーキテクチャ アンチパターンである Jumbleというパターンに陥る
    ○ 【アーキテクチャ アンチパターン】Jumbleより
    ● 垂直に分割した要素と水平に分割した要素が入り乱れること
    ○ つまり、垂直に分割した目的と水平に分割した目的が正しくない
    ● これにより、XXX性が落ちる
    ○ 1つの機能変更に対して、複数のモジュールを変更しなければならない
    ■ 単一責任の原則の違反にもなる
    垂直な分割と水平な分割に失敗すると...
    TOPIC

    View full-size slide

  46. | © Leverages inc.
    56
    ● ソフトウェアも垂直と水平に分割することができ

    ○ 水平→”責務”
    ○ 垂直→”機能”
    ● ”機能”で分割するには相当なテクニックがいる
    ○ 安易に分割するとアンチパターンに陥る
    こともある
    ● 「適切」に分割することができれば
    ○ 目的に応じた設計ができるようになる
    ○ XXX性が向上する
    ソフトウェアにおける垂直と水平
    まとめ

    View full-size slide

  47. モジュラーモノリスへ挑戦

    View full-size slide

  48. | © Leverages inc.
    58
    ”すべてのコードが単一のアプリケーションを動かすシステムであり、異なるドメイン間に厳密に強制された境
    界があるシステム
    適切なモジュール分割を行ったモノリスを調べていくとそれが「モジュラーモノリス」と呼ばれていることを知りま
    した。
    端的に言うと理想的なモジュール分割が行われた「きれいなモノリス」 です。”
    [翻訳] Shopifyにおけるモジュラモノリスへの移行 より
    👉 1つのデプロイメントラインを維持しつつ、サービス分割をモジュール分割とする
    モジュラーモノリスってなに?
    TOPIC

    View full-size slide

  49. | © Leverages inc.
    59
    ● サービス分割
    ○ システムごと分割するので、
    ○ デプロイ単位も分かれる
    ■ マイクロサービスなど
    ● モジュール分割
    ○ システム内のモジュールを分割する
    ので、
    ○ デプロイ単位は分かれない
    ■ モノリスも同様
    サービス分割とモジュール分割
    TOPIC
    アーキテクチャ 【まとめ】 -マイクロサービス、ミニサービス、モジュラーモノリス、モノリ
    シックアーキテクチャを並べて比べてみました-より

    View full-size slide

  50. ソフトウェアにおける
    垂直と水平で考えてみる

    View full-size slide

  51. ソフトウェア
    モジュール
    Presentation
    Application
    Domain
    Infrastructure
    水平に”責務”で分割

    View full-size slide

  52. ソフトウェア
    モジュール
    Presentation
    Application
    Domain
    Infrastructure
    垂直に”機能”で分割

    View full-size slide

  53. ソフトウェア
    案件モジュール
    Presentation
    Application
    Domain
    Infrastructure
    人材モジュール
    Presentation
    Application
    Domain
    Infrastructure
    垂直に”機能”で分割
    ”モジュラーモノリス”が完成

    View full-size slide

  54. ソフトウェア
    案件モジュール
    Presentation
    Application
    Domain
    Infrastructure
    ソフトウェア
    人材モジュール
    Presentation
    Application
    Domain
    Infrastructure
    ソフトウェアで分割すると、マイクロサービス が完成

    View full-size slide

  55. ソフトウェア
    モジュール
    Presentation
    Application
    Domain
    Infrastructure
    ソフトウェア
    案件モジュール
    Presentation
    Application
    Domain
    Infrastructure
    人材モジュール
    Presentation
    Application
    Domain
    Infrastructure
    ソフトウェア
    案件モジュール
    Presentation
    Application
    Domain
    Infrastructure
    ソフトウェア
    人材モジュール
    Presentation
    Application
    Domain
    Infrastructure
    モノリス モジュラーモノリス マイクロサービス

    View full-size slide

  56. | © Leverages inc.
    67
    ● レイヤー単位で分割
    ○ 1つのソフトウェアに複数のドメイン
    が存在する可能性がある
    ● 結果
    ○ 技術的な認知負荷は減る
    ○ 1つの機能変更に対して、それぞれ
    のモジュールを修正しなければなら
    ない
    レイヤーごとにモジュール化したらだめなの?
    TOPIC

    View full-size slide

  57. | © Leverages inc.
    68
    ● モジュラーモノリスとは
    ○ 理想的なモジュール分割が行われ
    た「きれいなモノリス」
    ○ 1つのデプロイメントラインを維持しつ
    つ、サービス分割をモジュール分割
    とする
    ○ デプロイ単位は分かれない
    ● ソフトウェアにおける垂直と水平を活用し
    て、モジュラーモノリスにすることができる
    モジュラーモノリスへ挑戦
    まとめ

    View full-size slide

  58. モジュラーモノリスを実践

    View full-size slide

  59. | © Leverages inc.
    70
    流れ
    1. モノリス✖レイヤードアーキテクチャ
    2. モジュール分割
    3. モジュールをNPMパッケージ化
    補足
    ● 小さく応用
    ● 実際に応用している例を紹介
    実践の流れ
    INDEX

    View full-size slide

  60. | © Leverages inc.
    71
    ● presentaition
    ○ controller
    ■ APIエンドポイント
    ● application
    ○ usecase
    ■ ユースケース
    ○ adapter
    ■ プロセス外依存
    ● domain
    ○ entity
    ■ エンティティ
    ○ value-object
    ■ 値オブジェクト
    ● infrastructure
    ○ mysql
    ■ MySQLの永続化
    ○ grpc
    ■ 別サービスのアクセス
    1. モノリス✖レイヤードアーキテクチャ
    実践

    View full-size slide

  61. | © Leverages inc.
    72
    2. モジュール分割
    実践
    ● project
    ○ 案件モジュール
    ● engineer
    ○ 人材モジュール
    ● entrypoint
    ○ APIエンドポイントをルーティング
    ○ DIコンテナを設定
    ○ …
    ※ 上記以外のモジュールはモノリス状態
    ※ ルーティングなどは名前の衝突は避ける

    View full-size slide

  62. | © Leverages inc.
    73
    ● 各モジュールをNPMパッケージ化
    ○ monorepo化
    ● メリット
    ○ パッケージも疎にすることができる
    ○ モジュール間の参照をパッケージ参
    照にできる
    ○ 切り離す時にパッケージごと抜き出
    すだけになる
    3. モジュールをNPMパッケージ化
    実践

    View full-size slide

  63. | © Leverages inc.
    74
    ● 部分的に適用することも可能
    ○ マイクロサービスへのアクセス
    ○ データリソースへのアクセス
    ○ …
    ● 右図の例
    ○ 1つにまとまっている状態
    ○ マイクロサービスごとに分割
    ○ モジュールをパッケージ化
    ● 小さいところから取り組むことができる
    小さく応用
    補足

    View full-size slide

  64. | © Leverages inc.
    75
    ● オウンドメディアサイトのバックエンド
    ○ gRPC ✖ モジュラーモノリス
    ● モジュラーモノリスを採用
    ○ 分割軸はメディア毎
    ■ ltc
    ● キャリア領域
    ■ ltf
    ● フリーランス領域
    ■ …
    ● monorepoを採用
    ○ turbopackを利用
    実際に応用している例を紹介
    補足

    View full-size slide

  65. | © Leverages inc.
    77
    ● 物事を目的に応じて、垂直(縦)と水平(横)で分割することで、 目的に応じた設計ができるようになる
    ● ソフトウェアも垂直と水平に分割することができる
    ● ”機能”で分割するには相当なテクニックが必要で、安易に分割するとアンチパターンに陥ることもある
    ● ソフトウェアも「適切」に分割することができれば 目的に応じた設計ができるようになる
    ● モジュラーモノリスとは理想的なモジュール分割が行われた「きれいなモノリス」
    ● ソフトウェアにおける垂直と水平を活用して、モジュラーモノリスにすることができる
    まとめ
    最後

    View full-size slide

  66. 垂直と水平の分割
    モジュラーモノリスを活用しよう!!!
    みんなでより良いソフトウェア開発を過ごせるように

    View full-size slide

  67. | © Leverages inc.
    79
    ● 資料
    ○ 「水平分散システム」と「垂直分散システム」の違い
    ○ 分散されたモノリスになってしまうマイクロサービス
    ○ 【アーキテクチャ アンチパターン】Jumble
    ○ [翻訳] Shopifyにおけるモジュラモノリスへの移行
    ○ アーキテクチャ 【まとめ】 -マイクロサービス、ミニサービス、モジュラーモノリス、モノリシックアーキ
    テクチャを並べて比べてみました -
    ● 書籍
    ○ エリック・エヴァンスのドメイン駆動設計
    ○ マイクロサービスアーキテクチャ 第2版
    ○ ソフトウェアアーキテクチャ・ハードパーツ ―分散アーキテクチャのためのトレードオフ分析
    参考資料・書籍

    View full-size slide