バックエンドプロジェクトのアーキテクチャ設計とスケーリング:マイクロサービス vs モノリス

バックエンドプロジェクトのアーキテクチャ設計とスケーリング:マイクロサービス vs モノリス

バックエンドのアーキテクチャは、日々の作業がどれほど苦痛か、あるいは快適かを決定づけることがよくあります。アプリケーションが成長するにつれて、初期の選択のひずみが見え始め、決断を迫られます。信頼できるモノリスを使い続けるか、それともすべてをバラバラにしてマイクロサービスにするか?

特効薬はありません。どちらのアプローチにもそれぞれの場所があり、「正しい」選択は純粋な技術的メリットよりも、チーム構造やビジネスのステージに依存することがよくあります。2つの主要な候補と、多くの場合に最も機能する、実用的で中道的な第3の選択肢を見てみましょう。

1. 候補者

マイクロサービスアーキテクチャ

マイクロサービスの背後にある考え方は単純です。1つの巨大なアプリケーションを構築するのではなく、小さくて独立したサービスの集合体を構築します。それぞれが1つのことをうまく行います。

分散型チームのように考えてみてください。各サービスは独自のデータベースを管理し、他からの許可を求めることなく、準備ができ次第いつでもデプロイできます。請求チームがGoを使いたいと思い、認証チームがRustを愛用している場合、両方とも思い通りにできます。この自律性は、少なくとも理論上は、イノベーションとスピードを促進します。

実際には、500人の開発者全体で単一のリリースを調整するのが悪夢であるような大規模な組織にとって、これは素晴らしいことです。

図:マイクロサービスアーキテクチャ

マイクロサービスアーキテクチャ図

モノリスアーキテクチャ

モノリスは伝統的なアプローチです。1つのコードベース、1つのアプリケーション、1つのデプロイメント。ユーザーインターフェースからビジネスロジック、データアクセスに至るまで、すべてが一緒に存在します。

一部の界隈では「モノリス」という言葉がほとんど汚い言葉のようになっていますが、否定できない利点があります。シンプルです。関数がどこで定義されているかを見つけるために地図は必要ありません。デプロイは単一のスクリプトです。中小規模のチームにとって、このシンプルさはスーパーパワーです。インフラの複雑さに足を取られることなく、素早く動くことができます。

図:モノリスアーキテクチャ

モノリスアーキテクチャ図

2. トレードオフ

なぜマイクロサービスにするのか?

マイクロサービスのコスト

なぜモノリスにこだわるのか?

モノリスの限界

「サービス多すぎ」の罠

中小企業によく見られるアンチパターンは、エンジニアよりも多くのマイクロサービスを作ってしまうことです。100人のエンジニアが300以上のサービスを維持しようとしている組織を見たことがありますが、結果は完全なカオスです。

その閾値を超えると、多くのサービスには明確な所有者がいなくなるか、所有者がサービスを引き継いだものの、組織再編のためにそのコンテキストを全く持っていない状態になります。また、脆弱性を排除するためにすべてのリポジトリの依存関係を更新することに多くの時間を費やすことになります。マイクロサービスを効果的に機能させるには、専任のプラットフォームチームとツーリングへの多大な投資が必要です。ほとんどのスタートアップにはそのインフラを構築するリソースがなく、「アジャイル」なアーキテクチャをメンテナンスの悪夢に変えてしまいます。

3. どちらがあなたに合っていますか?

トレンディだからという理由でアーキテクチャを選ばないでください。現在の問題を解決するから選ぶのです。

以下の場合、マイクロサービスを選択してください:

以下の場合、モノリスを選択してください:

4. 実用的な道:モジュラーモノリスと段階的な分割

ここに秘密があります:いきなりマイクロサービスに飛びつく必要はありません。実際、おそらくそうすべきではありません。

モジュラーモノリスは素晴らしい中道案です。単一のデプロイ可能なユニットを構築しますが、内部的にはモジュール間に厳格な境界を強制します。Module AのコードはModule Bのコードを直接インポートできず、定義されたパブリックインターフェースを経由する必要があります。これにより、インフラのオーバーヘッドなしにマイクロサービスのコード構成の利点が得られます。

アプリケーションが成長するにつれて、独立させる必要がある部分を切り離すことができます。

進化させる方法:

  1. 継ぎ目を見つける: アプリの中で、独立した製品のように振る舞う部分を特定します。「ユーザー認証」や「画像処理」は一般的な候補です。
  2. 書き直さずに抽出する: そのコードを別のサービスに移動します。共通のライブラリ(ログやメトリクスの設定など)は共有して、一貫性を保つことができます。
  3. 反復する: すべてを一度に分割しないでください。おそらく、1つのメインモノリスと、特定のタスク用の2つの小さなマイクロサービスが必要なだけかもしれません。
  4. 共有コードに注意: サービス間でデータベーステーブルを共有するのは罠です。サービスを分割する場合、理想的にはそのサービスがデータを所有すべきです。

図:ハイブリッドアプローチ

マイクロサービスアーキテクチャ図

結論

「マイクロサービス vs モノリス」の議論は、しばしば論点を見失っています。どのアーキテクチャが理論的に優れているかではなく、今現在、どのトレードオフのセットなら受け入れられるかが重要なのです。

よく構成されたモノリスから始めましょう。痛みを感じたときに分割してください。それより前ではありません。未来の自分(そしてあなたのDevOpsチーム)は感謝するでしょう。

© Melvin Laplanche - All rights reserved.