見出し画像

視聴メモ: モジュラモノリス徹底解剖〜実践者から学ぶLunch LT〜


概要

非モジュラーモノリスからモジュラーモノリスへのステップ

株式会社ナレッジワーク 川中さん

なぜモジュラーモノリスにするのか?

  • チーム事情

マイクロサービスと比較したメリット

  •  バージョン整理整合容易性

  • インフラ引用容易性

どのように変更したか?

  • トップレベルには意味ごとにモジュールが並び、その中がclean architectureのようになっている

  • モジュールが公開するAPI以外はinternal packageへ

まずはディレクトリ分け

  • まずmodule単位で切って全部公開(ディレクトリだけ移動する)

  • 他のmoduleから内部データが無造作に使われていたりするため、隠蔽は諦める

  • 言語によってはpackage公開ルール周りで不自然な構成になるので、諦める

一部モジュールAPIの公開(隠蔽していく)

  • 容易なモジュールから着手

最終構成

発表資料より拝借

LTの発表内容になかった追加事項

  • モジュール間のRDBデータ分離は

    • やっていない

  • モジュール間のトランザクション

    • 基本的には無いように作る

    • どうしてもうまくいかないやつは使用を見つめ直す

  • モジュールの粒度

    • 最初はまずはなるべく小さく(後から解くのは難しい)

    • 小さく分けた複数のモジュールを関連するモジュールでまとめ、大きな意味でのまとまりを後で作る

RDRAとDDDでGoのモジュラーモノリスアプリを設計してみた話

株式会社ラクス 今本さん

別の登壇資料発見

RDRAに関する概念

発表資料より拝借
  • システム価値

    • システムが「誰にとっての価値を実現するか」を明らかにする

  • システム外部環境

    • システムが「どのように使われるのか」を明らかにする

  • システム境界

    • システムと「どう関わるか」を明らかにする

  • システム

    • システムそのものを表現する

[アイコン・ダイアグラム]

  • アイコン

  • ダイアグラム

作図はdraw.ioで作図した

実践してみた感想

  • 「要件定義」にとどまらず「基本設計」まで踏み込んだドキュメントが完成される

  • 「業務」や「ビジネスユースケース」の分割は難しい

  • ビジネスとシステムのバランス感覚が必要

基本/詳細設計フェーズ

  • 戦略的DDDを実践

    • コンテキストマップの作成

    • ユビキタス言語となる用語集の作成

レイヤードアーキテクチャを採用した

DDDを実践した感想

発表資料より拝借

実装フェーズ

  • Goでモジュラーモノリス

    • GoのWorkspace modeを活用

実装の基本方針

発表資料より拝借

未来の話

発表資料より拝借

Goでモジュラーモノリスを実践してみた感想

発表資料より拝借

TypeScript・モジュラーモノリスによる型安全なWebサービス開発

SALESCORE株式会社 成澤さん

最近バズった記事

発表資料

設計紹介

  • 垂直分割: ドメインごとに分割

  • 水平分割: レイヤーごとに分割

どちらも利用している

Turborepoを使ったモノレポ構成

モジュールごとにpackage.jsonを定義し、mainにindex.tsを指定
index.tsにexportしたい関数を書く

実装イメージ

アプリからは「モジュールを呼び出して組み合わせる」イメージで実装できる

良かったところ

  • 複雑なサービスが複数のモジュールから構成されている感覚を強く持てる→頭の中が整理できる

  • 依存関係を強制し、レイヤーを明確にできる

悪かったところ

  • buildとlintのパフォーマンスが悪い

  • 初期構築の難易度が高い

マイクロサービスではなくモジュラモノリスを採用した理由

株式会社プラハ 粟田さん

技術負債が溜まり続けた既存システム

  • リリースから8年

  • テストやドキュメントがない

  • 安易に直せない→大量の「運用回避」

新機能を別システムとして作るという選択を取った

まずはマイクロサービス化を検討した

  • そう簡単に作れない

    • コストがかかる

    • サービスごとにインフラ

  • 社外の経験者に伺っても厳しい意見がほとんど

    • デプロイまちが発生するくらい肥大化していないならメリットが少ない

    • 逆にマイクロサービスが負債になる

ではモノリス?

  • 雑にかくとすぐに大きな泥団子になる

  • 内部品質を高く保つにはある程度の設計スキルが必要

  • 将来的にマイクロサービスに移行しづらい

モジュラモノリスを検討

  • モジュールで分けられて疎結合になるため、泥団子化を防ぎやすい

  • マイクロサービスへの布石になる

    • モジュール境界はサービス境界に比べて戻しやすい

  • 先にDBを分割することも可能

    • モジュールごとにDBを用意しても良い

まとめ

  • マイクロサービスを選ばなかった理由

    • 多くの問題を解決できるが、負債になる可能性が高いと判断

      • 組織の規模に見合わない

  • モジュラモノリスにした理由

    • 大きな泥団子化を防ぎたかった

    • マイクロサービスに移行する可能性はゼロではない

モノリスとマイクロサービスを経てモジュラモノリスを導入した実践事例

アソビュー株式会社 兼平さん

アソビューの歴史

  • モノリス ~2012

  • マイクロサービス ~2015

  • モノリス 2020~

目指したもの

事業、組織が拡大してもひとりひとりのパフォーマンスを最大限発揮し、技術だけでなく事業貢献ができるように

実現方法

別記事にて

分割単位、境界の決め方

  • 今後の事業や組織成長、変化も踏まえやすい単位を意識

    • 現状の組織には合わせすぎない、組織変更に適用できるように

DB分割する?

  • 両方のパターンがある

  • トランザクションは極力分割する

変更容易性は?

マイクロサービスに比べ、モジュールの立ち上げや統廃合はかなり容易

可用性への対応は?

  • 実行時にはモノリスなので単一障害点になりうる

結局どうなのか?

多くの組織で必要十分な選択肢になり得る

オライリーのモノリスからマイクロサービスへ

まとめ

アーキテクチャは事業や組織論と密接に紐づいているため、技術面以外の戦略もセットで現実解を探すことが重要

  • 選択はゼロイチではない

    • モノリスとマイクロサービスの間くらいの選択肢としてモジュラモノリス

    • モノリスで十分な場合もある


この記事が気に入ったらサポートをしてみませんか?