シェア

はじめに

アプリケーションアーキテクチャの最も一般的なアプローチとして、単一の大きなアプリケーションで機能が提供されるモノリシックアプリケーションと、機能が連携する小さなユニットに分割されるマイクロサービスアーキテクチャの2つがあります。これらの設計の選択は、開発体験、デプロイの容易さ、および運用フットプリントに関して、広範囲にわたる影響を与える可能性があります。

アプリケーションアーキテクチャが環境に影響を与える最も重要な方法の1つは、データベースとの連携にどう影響するかです。アプリケーション構造はデータ構造に影響を与えることが多く、データの保存場所や操作方法にも影響を与えます。このガイドでは、モノリシックとマイクロサービスの違い、特にこれらの決定がデータベースにどのように影響するかについて説明します。

モノリスとマイクロサービスとは?

ソフトウェア開発において、モノリスとマイクロサービスはともにアプリケーションアーキテクチャを記述するものです。

モノリシックアプリケーション

モノリシックアプリケーションは、アプリケーション開発とデプロイの従来のスタイルです。モノリシック設計では、有用な作業を実行するために必要な処理、通信、調整のほとんどが、単一のアプリケーション内で内部的に行われます。アプリケーションは、外部の世界とインターフェースして、ユーザーからの入力やコマンド(多くの場合、ウェブサーバーのエンドポイントを介して公開される)を受け取り、データベースなどの他のサービスと対話します。

モノリスは、よく理解されている開発パターンに従っており、デバッグやトラブルシューティングに役立つ大規模なツール群を持っているため、人気があります。モノリシックアプリケーションの統合された性質は、運用環境でのデプロイと管理を比較的単純にします。さまざまなチームが同じアプリケーションで作業する際に変更を調整するには注意が必要ですが、可動部品の数は比較的小さいです。

とはいえ、単一の包括的なアプリケーションで作業することには、多くの欠点もあります。特定の機能に関連するすべてのコードが互いに連携していることを確認するために、アプリケーション開発は厳密に調整されなければなりません。また、異なる要求を満たすためにアプリケーション全体をスケールする必要がある場合、特に複数のコピーを実行する必要がある場合に、アプリケーションが調整に必要なインターフェースやロジックを持っていない可能性があるため、スケーリングは非常に困難になる可能性があります。

マイクロサービス

マイクロサービスは、アプリケーションの機能を多くの個別の「サービス」に分割するアプリケーションアーキテクチャの代替アプローチです。これらのサービスはそれぞれ明確に定義された責任を持ち、ネットワークを介して互いに連携して有用な作業を完了します。ある意味で、マイクロサービスはアプリケーションを分解し、内部通信をネットワーク通信として再実装する開発スタイルです。

人々がモノリシックアプリケーションよりもマイクロサービスを選択する理由は数多くあります。マイクロサービスでは、個々のパフォーマンスと負荷特性に応じてサービスを独立してスケールできます。スケーラビリティ自体の利点に加えて、さまざまなホストで小さなコンポーネントの複数のコピーを実行することで、ハードウェア障害がダウンタイムを引き起こさないようにアプリケーションの回復力を高めることができます。

この柔軟性により、さまざまなコンポーネントのスケーリングだけでなく、開発自体も切り離すことができます。異なるサービスは、他のコンポーネントと通信できるインターフェースを提供する限り、完全に異なる言語を使用して構築できます。これは、チームがコンポーネントに対して持つ「所有権」に大きな影響を与え、迅速なイテレーションや、他の領域に影響を与えることなくサービスを完全に書き換える能力などの利点をもたらします。

マイクロサービスには、独自の課題も伴います。たとえば、多数のサービスをデプロイおよび管理する運用上の複雑さは、特にチームに強力な運用経験がない場合、圧倒される可能性があります。サービス間通信の重要性は、ネットワーク層に課される要求の複雑さとトラフィック量の両方を増加させます。同時に、分散環境では従来のツールが適用できないことが多いため、デバッグとテストはより困難になります。

マイクロサービスはデータベースアーキテクチャにどのように影響するか?

上記で議論したアーキテクチャオプションは、開発プロセスがどのようなものになるか、そして本番環境でアプリケーションを運用することがどのようなものになるかに大きな影響を与えます。特に影響を受ける可能性のあるコンポーネントの1つがデータベースです。

モノリシックアプリケーションは、多くの場合、一元化されたデータベースとともにデプロイされます。アプリケーションは読み取り操作をレプリカに渡し、負荷をより均等に分散させる場合がありますが、一般的には、データはすべて1箇所にあります。この場合、一元化されたデータベースは、さまざまなアプリケーションコンテキストと機能に関連する情報を管理する責任を負います。

しかし、マイクロサービスは、より複雑なデータ環境と組み合わされることがよくあります。個々のマイクロサービスは、その特定のサービスのデータを管理することのみを目的とした独自のデータベースインスタンスとともにデプロイされることがよくあります。

サービス固有のデータベースを使用する利点と欠点

このパターンは、開発者が各マイクロサービスを独立して反復およびデプロイできるため、人気があります。開発における最大の調整点の1つは、データベースを変更するコードです。なぜなら、変更がアプリケーションの多くの異なる部分に影響を与える可能性があるからです。あるチームがデータベーススキーマを変更すると、以前のスキーマを期待して書かれた機能が壊れる可能性があります。

各マイクロサービスに独自のデータベースを与えることで、この連鎖的な影響を切り離し、開発者がより少ない調整とより大きな信頼性で必要な変更を加えることができます。これにより、サービスを明確に定義されたインターフェースを介してのみ互いにやり取りする、個別の集中型コンポーネントとして管理するという目標が推進されます。

ただし、マイクロサービスごとのデータベースパターンにも独自の課題がないわけではありません。マイクロサービスの数が増えるにつれて、個々のデータストアの数も増えます。チームは各新しいサービスについてデータベースのデプロイ、バックアップ、フェイルオーバー、その他の懸念を管理する必要があるため、運用要件は増加します。十分に開発されたツールと専門知識がなければ、これはかなり迅速に管理不能になる可能性があります。

開発者は、複数のマイクロサービスにまたがる可能性のあるクエリや更新をどのように調整するかについても考慮する必要があります。たとえば、注文が行われる場合、顧客データ、在庫データ、および注文情報自体は、異なるマイクロサービスによって管理される可能性があります。

まとめ

マイクロサービスパターンは、アプリケーションの拡張を支援し、組織として特定の開発およびデプロイタスクの調整を容易にすることができます。新しいコードがアプリケーションの他の部分に与える影響を制限しながら、より迅速に変更を反復およびリリースするのに役立ちます。

アーキテクチャの選択が、開発プロセス、インフラストラクチャ、および運用要件のさまざまな部分にどのように影響するかを理解することが重要です。マイクロサービスの場合、データベース環境はモノリシックデプロイとは大きく異なることがよくあります。生産性を維持するために、どのような変更を予期し、課題をどのように管理するかを理解することが重要です。

著者について
Justin Ellingwood

ジャスティン・エリングウッド

ジャスティンは2013年からデータベース、Linux、インフラストラクチャ、開発者ツールについて執筆しています。現在は妻と2羽のウサギと共にベルリンに住んでいます。彼は通常、三人称で書く必要がないため、関係者全員にとって安心です。
© . All rights reserved.