Article

モノリス vs マイクロサービス:アーキテクチャ選定のポイント

高田晃太郎
モノリス vs マイクロサービス:アーキテクチャ選定のポイント

ソフトウェア配信の生産性を示すDORAレポートでは、エリートパフォーマーが本番デプロイを日次で実行し、変更失敗率は0〜15%に収まることが示されています。¹ 一方、CNCFの年次調査ではKubernetesを「利用または評価中」の組織が96%に達し、マイクロサービスとクラウドネイティブはもはや特殊解ではありません。² とはいえ、サービスを細かく分割すれば即座に俊敏化するわけではなく、逆に運用の複雑性で足を取られる例も珍しくありません。各種レポートと現場の実情を照らし合わせると、アーキテクチャは思想ではなく投資配分の意思決定であり、ビジネスの変化速度とチームの分業能力、ドメインの結合度、そして運用コストの勘定という四つ巴の中で初めて最適点が見えてきます。選定は二者択一ではなく連続体であり、「いまの最適」と「次の最適」を繋ぐ移行曲線をどう描くかが要諦です。本稿では、モノリシックアーキテクチャ(モノリス)とマイクロサービスアーキテクチャの比較を、CTO視点の実務に落とし込みます。

意思決定のフレームワーク:4軸で測る適合度

まずビジネス速度の軸です。プロダクトの主要フローに対する変更頻度が週次から日次へ高まり、並行開発ストリームが増えているなら、デプロイ単位の細分化は待ち時間を削減します。ここで重要なのはデプロイ単位の「独立性」です。単にリポジトリを分割しても、リリース承認やデータスキーマ更新を同時に要するなら実効性は出ません。エピック(大きめの開発単位)の流量、レビュー待ち時間、ロールバック時の影響半径を測り、分割でどの待ち時間が本当に減るのかを見積もることが出発点です。⁷

次にチーム構造です。いわゆる「二つのピザで足りる」規模、すなわち5〜10人前後のチームが複数存在し、それぞれが明確な成果責任を持って動けるかが鍵になります。Conwayの法則(組織のコミュニケーション構造はソフトウェア構造に投影される)に従い、所有権が曖昧な領域が多いほど、マイクロサービス化はAPI境界の争点を増やし、結局は「分散型モノリス」を生みがちです。逆に、単一チームで主要機能を完結できる段階では、モジュラーモノリスの方が総合生産性が高くなることは少なくありません。⁵

三つ目はドメインの複雑性と結合度です。注文・決済・在庫のように自然な境界づけがあり、データ所有が明確に分けられるなら分割は理にかないます。しかし、同一トランザクションに複数のサブドメインが高頻度でまたがる場合、分散トランザクションやサガ(分散処理の調停パターン)による最終的整合性の運用コストが増大します。⁶ モノリスでのACID(原子性・一貫性・隔離性・耐久性)トランザクションが価値を持つ領域は、無理に分散させるべきではありません。境界づけられたコンテキストの数、相互依存の方向と強度、整合性要件を文章で洗い出し、どこに遅延許容があるかを見極めると良いでしょう。

最後は運用とコストです。サービスが増えるほど監視、アラート、ログ収集、トレーシング、CI/CD、ステージング環境の維持といった固定的な運用コストはほぼ線形に増加します。⁴ プラットフォームエンジニアリングの観点では、数十サービス規模を超えるあたりから共通基盤の自動化が実質的に必須になると報告されています。⁴ また、一定割合のエンジニアリング工数を恒常的にプラットフォーム運用に投じる組織も少なくありません。⁴ 予算に上限がある現実の中で、サービス分割の利益がこの固定費を上回るかを、DORAの四指標とSLO(Service Level Objective、サービス目標値)達成率、インシデントのMTTR(平均復旧時間)、クラウド支出のトレンドで定量確認することを推奨します。⁷

評価の実務:スコアカードと意思決定の窓口

現実的な進め方として、主要機能ごとに変更頻度、所有チーム、データ所有、整合性要件、スケール特性、障害の影響半径を短く記述し、各観点を低・中・高の三値で採点するスコアカードを運用します。スコアが高い領域は独立性の候補、低い領域はモノリスに残す候補となります。この判断の窓口をCTO直轄のアーキテクチャ評議会に限定し、査読と割り込みの優先順位を一本化すると、分割の一貫性が保たれます。

モノリスが勝つ条件:スピードと集中の実装

モノリスは古いどころか、適切に設計されたモジュラーモノリスは初期の到達速度と保守性の両立に優れます。単一プロセス内での関数呼び出しはネットワーク越しのリモートコールに比べ、レイテンシも失敗確率も低く、³ ACIDトランザクションにより一貫性の担保も容易です。API契約の破壊的変更が頻出する創業初期や、探索フェーズでスキーマが落ち着かない時期には、変更の摩擦を最小限にする集中構造が合理的です。⁵

成功するモジュラーモノリスの共通点は明確です。リポジトリは一つでも、内部はドメイン単位のパッケージ境界と依存の有向非循環グラフを保ち、UI、アプリケーション、ドメイン、インフラの各層を明確に分離します。ビルド時に循環依存を検知し、レイヤー跨ぎの参照をCIで落とす仕組みを入れると、将来の分割が容易になります。デプロイは一体であっても、チームごとのコードオーナーシップとレビューポリシーを定義し、モジュール単位でのテスト自動化と契約の固定化を進めると、後から抽出する際の境界線が自然と浮かび上がります。

スケール要件においても、CPUやメモリ負荷がシステム全体で比較的均質であれば、単一アプリケーションの水平スケールとキャッシュ戦略で十分に戦えます。⁵ データベースは読み取り負荷の分散やレプリカ活用で延命でき、キャッシュヒット率の改善やN+1クエリの解消は、分割の効果を上回る費用対効果を持つことがよくあります。時間軸の視点では、プロダクトマーケットフィットの証明までをモノリスで走り、単位経済性と成長仮説が明確になった領域から投資を厚くするのが健全です。⁵

落とし穴:巨大一枚岩と暗黙の依存

モノリスの失敗は「一枚岩」そのものにあるのではなく、境界が曖昧な共有モデルと暗黙の依存に起因します。共通ユーティリティにドメイン知識が入り込み、双方向の依存が増えると、変更の波及が全域に及びます。これを防ぐには、ドメイン知識はドメイン層に閉じ込め、外部I/Oはインターフェース越しに疎結合化し、入出力の契約をテストで固定化します。こうしておくと、同じ構造を保ったままプロセス境界へ「切り出す」移行が現実的になります。

マイクロサービスが勝つ条件:独立性と耐障害性の経済学

マイクロサービスの価値は、独立した開発・デプロイ・スケールの自由度にあります。⁵ 機能群ごとにトラフィックの変動が大きく、課金や検索のように負荷特性が異なる領域があるなら、別々にスケールできることの経済効果は大きいものです。また、障害の影響半径を限定できるため、SLOを守る上でも有利になります。³ ヘテロジニアス(異種混在)な技術選択を許し、チームが最適な言語やデータストアを選べるのも、探索フェーズを終えた領域にはプラスに働きます。⁵

ただし独立性は自動的には生まれません。APIやイベント契約の破壊的変更はチーム間調整コストを増やし、分散トレーシングや一貫したアラート運用が整っていないとMTTRはかえって伸びます。⁴ セキュリティ面でもサービス間通信、認証・認可、シークレット管理の標準化が欠かせません。ここでプラットフォームエンジニアリングの投資が効きます。デプロイパイプライン、サービステンプレート、ランブック、ダッシュボードを共通化し、チームが差分のビジネスロジックに専念できる状態を整えると、増える運用コストを相殺できます。⁴

規模の目安として、二桁後半のエンジニアが複数のストリームで並行開発し、四半期ごとに主要機能の独立リリースが計画される段階では、モノレポのCI待ちや結合テストのボトルネックが顕在化します。こうした組織は契約テストとカナリアリリース、段階的ロールアウトを伴う小刻みなデプロイ戦略と相性が良く、結果としてデプロイ頻度の上昇と変更失敗率の低下を同時に狙えます。³ 監査や規制対応でも、境界での監査証跡と責任分離がしやすくなるため、証跡管理コストの見通しが立ちやすくなります。

落とし穴:分散型モノリスと早すぎる分割

アンチパターンは分散型モノリスです。サービスの数は多いのに、スキーマ変更やデプロイの調整が常に全体同時に必要で、結局はモノリスより遅く高く脆い状態に陥ります。原因の多くはデータ所有の曖昧さと同期的なクロスコールの連鎖です。所有境界を明示し、読み取りは複製、更新は単一の所有者に限定する設計に改め、遅延許容部分は非同期イベントで接続すると、調整コストは目に見えて下がります。⁶ もう一つの罠は早すぎる分割です。ドメインが不安定な段階でサービスを刻むと、境界の引き直しのたびにマイグレーションと再契約が発生し、学習コストばかりが積み上がります。

移行戦略:二者択一ではなく移行曲線を描く

選定の現実解は、いきなりの全面移行ではなく、モジュラーモノリスを足場に分岐を設けることです。まずはアーキテクチャの健康度を高め、循環依存を排除し、契約をテストで固定化します。次に変更頻度が高く、同時にSLOに対する影響半径が大きい領域から、外部化の対象を少量ずつ選びます。このときUIや外部公開APIに対してBFF(Backend for Frontend)を先に立てると、フロントの変更を後方互換で吸収しながら内部の境界再編を進められます。ライフサイクルの長いデータはリードレプリカで読みを先行独立させ、書き込みは所有者に集約し、イベントで徐々に伝播させると、停止時間のない分割が現実的になります。⁴

取引的一貫性が必要なケースでは、まずモノリス内部でサガやアウトボックス(更新とイベント発行の一貫性を保つ仕組み)のパターンを導入し、最終的整合性の運用と監視を学習します。これにより、後からプロセス境界をまたいでも運用メカニズムが変わりません。⁶ 対外インテグレーションでは契約テストを先に整備し、リリースの安全装置としてフィーチャーフラグと段階的ロールアウトを徹底します。³ こうした準備を経て、ストラングラーフィグ(既存機能を徐々に新実装で包み替える)方式で周辺から機能を新実装に寄せ替え、呼び出しを切り替えた後に旧実装を撤去します。

投資と期間の目安を現実的に捉えることも重要です。既存モノリスのモジュール境界を整え、契約テストと監視を整備する段階は三〜六ヶ月で終えるのが理想です。以降、四半期ごとに一〜二機能を抽出し、年間で三〜六サービスを育てるペースなら、品質と知識の蓄積が伴います。プラットフォーム投資は早期に小さく始め、テンプレート化と自動化の再利用度が上がるほど限界費用は下がります。監視においては分散トレーシングのサンプリング率やラベル設計を先に決め、運用品質を可視化することで、DORAのデプロイ頻度とMTTRのトレードオフを組織的に最適化できます。⁴

指標で回す運用:結果で判定する

どちらのアーキテクチャを選んでも、成果は指標で評価します。リードタイム、デプロイ頻度、変更失敗率、MTTRの四指標に、SLOのエラーバジェット消費、コストではクラウド支出の単位経済性とプラットフォーム工数の割合を加えます。⁷ 分割の効果が出ていれば、デプロイは小刻みになり、ロールバックは迅速で、障害の影響半径は狭まり、SLO違反は減ります。逆に、レビュー待ちや合意形成に時間を取られ、横断的な調整に会議が増えるなら、分割は時期尚早か境界が悪いサインです。意思決定は常に可逆であるべきで、戻せる設計と運用を保つ限り、組織は学習の速度を落としません。

まとめ:いまの最適と次の最適をつなぐ

モノリスとマイクロサービスは対立概念ではなく、製品と組織の成熟度に応じて行き来するための選択肢です。短期の到達速度と集中が必要ならモジュラーモノリスで仮説検証に全振りし、変更の独立性と耐障害性が支配的になってきたら、境界を守れるところから外に出す。どちらを選んでも、成果はDORAの四指標とSLOで測り、プラットフォーム投資は自動化の再利用度で回収する。この地味なループを粘り強く回すチームこそ、長期の速度を守れます。⁷

あなたの組織でいま最も遅いのはリリースなのか、レビューなのか、ロールバックなのか。ボトルネックが一つ特定できたなら、アーキテクチャはもう決まりつつあります。次の四半期に改善を証明する実験を一つだけ設計し、指標で結果を見届けましょう。その積み重ねが、アーキテクチャの正解をあなたの組織の中に作っていきます。

参考文献

  1. Atlassian. DORA metrics: What are the four key metrics in DevOps?
  2. Cloud Native Computing Foundation. CNCF sees record Kubernetes and container adoption in 2021: Cloud Native Survey.
  3. The New Stack. Microservices vs Monoliths: An Operational Comparison.
  4. Future Internet (MDPI) 2023;15(1):37. Cloud-native/microservices adoption challenges (observability, cost, ops).
  5. Applied Sciences (MDPI) 2020;10(17):5797. Monolithic vs Microservices: when to choose which.
  6. IEEE Computer Society. ACID Transactions in Distributed Microservices Architecture.
  7. FasterSafely. Accelerate findings summary (DORA metrics and benchmarks).