マイクロサービス アーキテクチャ
マイクロサービス アーキテクチャは、拡張性に優れた分散型の最新システムを提供します。
多くの場合、今日の世界ではアプリケーションのモダナイゼーションとはマイクロサービスとして構築されたクラウド ネイティブ アプリケーションへの移行を意味します。マイクロサービスは、Docker や Kubernetes などのコンテナー テクノロジーによってデプロイされます。Netflix とアトラシアン以外にも、無数の組織がこの手法を採用しました。その理由は、マイクロサービス アーキテクチャによって拡張性、開発速度、サービス イテレーションが向上するためです。
マイクロサービス アーキテクチャでは、API を通じて通信する、独立してデプロイ可能な一連のサービスにアプリケーションを分割します。これによって、個々のサービスを個別にデプロイしてスケーリングできます。このアプローチによって、大規模で複雑なアプリケーションを迅速かつ頻繁に提供できます。モノリシック アプリケーションとは対照的に、マイクロサービス アーキテクチャでは、既存のコードの大部分を書き直すことなく、迅速に新しい機能を実装して変更を加えられます。
マイクロサービスのアーキテクチャの主な特徴は、次のとおりです。
複数のコンポーネント サービス
マイクロサービスを構成する個々のコンポーネントはゆるく結合されており、他のサービスの機能とアプリケーションの完全性を損なうことなく、各コンポーネントを開発、デプロイ、運用、変更、再デプロイできます。これによって、アプリケーションの個々の機能を迅速かつ簡単にデプロイできます。
高い保守性とテスト性
マイクロサービスでは、新機能を試してうまくいかなければ元に戻せます。これによってコードの更新が容易になり、新機能の市場投入までの時間が短縮されます。さらに、個々のサービスの障害やバグを簡単に特定して修正できます。
小規模チームによるオーナーシップ
通常は、小規模で独立したチームがマイクロサービス内のサービスを構築するため、アジャイル プラクティスと DevOps の採用が促進されます。チームが独立して作業し、迅速に行動できるようになり、開発サイクル タイムが短縮されます。
ビジネス機能中心の編成
マイクロサービス アプローチでは、ビジネス機能を中心にサービスが編成されます。チームは部門横断型で開発に必要なあらゆるスキルを持ち、個々の機能を実現するために取り組んでいます。
自動化されたインフラストラクチャ
マイクロサービスを構築して保守するチームは、通常、継続的なインテグレーション (CI)、デリバリー (CD)、デプロイ (CD) などのインフラストラクチャ自動化手法を使用します。これによって、他のチームに影響を与えることなく、各サービスを独立して構築してデプロイできます。また、新しいバージョンのサービスを以前のバージョンと並行してデプロイできます。
マイクロサービス アーキテクチャの例
例として、e コマース ソフトウェア プロジェクトがあると考えてみましょう。次の図は、複数のマイクロサービスとやり取りする Web とモバイルの各アプリケーションを備えた e コマース サイトを示しています。各マイクロサービスは、ドメインに固有の機能を提供します。
最新の Web アプリケーションはブラウザーで実行されて、多くの場合は CDN (コンテンツ配信ネットワーク) から提供されます。CDN では Web アプリケーションを世界中のサーバーに配信できるため、Web ブラウザーからすばやくダウンロードできるというメリットがあります。CDN は、画像、音声、動画などのメディア アセットの提供にも使用されます。たとえば、このシステムでは、販売する商品の画像と動画が CDN から提供されます。
この図に示すマイクロサービスは次のとおりです。
アカウント サービス
住所や支払い情報など、顧客アカウントに関する情報を提供します。
在庫サービス
顧客が購入できる商品の最新の在庫情報を提供します。
ショッピング カート サービス
このサービスによって、顧客は購入したい商品を在庫から選択します。
支払いサービス
顧客がショッピング カート内の商品の代金を支払います。
出荷サービス
購入した商品の梱包と配送をスケジュールします。
アプリケーションは、各マイクロサービスが公開する REST API を介してマイクロサービスとやり取りします。API ゲートウェイは、アプリケーションがマイクロサービスの API に依存できるようします。また、マイクロサービスを同じ API を持つ他のマイクロサービスと交換できるようになります。
各マイクロサービスは、1 つのサービスとデータベースで構成されています。マイクロサービスは REST API を処理してビジネス ロジックを実装し、データをデータベースに格納します。マイクロサービスについては、12 Factor App コントラクトに従って、データベースやキューなどのリソースが互いに分離されています。
マイクロサービスの構築方法
多くの組織にとって、モノリス アーキテクチャから始めることが最初のステップです。次に、コードベースを複数のサービスに分割し、グレースフルに失敗してネットワークの問題から回復するための適切なパターンを実装し、データの一貫性を確保し、サービス負荷を監視するなどを行う必要があります。しかし、それは技術的な側面に過ぎません。この他に、チームを再編成して、たとえば DevOps カルチャーを採用する必要もあります。
そして、難しい局面を迎えます。モノリスをマイクロサービスに分解する必要があります。モノリシック データベース スキーマのリファクタリングは、デリケートな操作になる可能性があります。各サービスに必要なデータセットと重複するデータセットを明確に特定することが重要です。継続的なデリバリーを活用すると、リリース障害のリスクを軽減できるだけでなく、チームがアプリケーションのデプロイでつまずくことなく、アプリケーションの構築と実行に集中できるようになります。
マイクロサービスとモノリシック アーキテクチャの比較
モノリシック アーキテクチャはソフトウェア プログラムの従来のモデルであり、自己完結型で他のアプリケーションから独立した統合ユニットとして構築されています。モノリスとは逆に、マイクロサービス アーキテクチャは、独立してデプロイ可能な一連のサービスに依存するアーキテクチャ手法です。モノリスはコード管理、認識、デプロイが容易であるため、プロジェクトの初期段階では重宝されることもあります。しかし、モノリス アプリケーションが大規模かつ複雑になると、拡張しにくくなり、継続的なデプロイが難しくなり、更新が煩雑になります。
モノリシック アプリケーションが分割できない単一のユニットである一方、マイクロサービス アーキテクチャではそのユニットを複数の独立したユニットの集合体に分割して、それらを連携させて全体を構成します。アプリケーションは独立してデプロイ可能な一連のサービスとして構築されて、分散して自律的に開発されます。
分散型アーキテクチャ
マイクロサービスは分散型システムのカテゴリに分類されます。分散型システムは、共通する共有の目標を達成するために複数の分離された計算ノード全体の計算リソースを利用するコンピューター プログラムの集合体であると定義されています。分散型システムはシステムの信頼性とパフォーマンスを高めて、スケーリングを容易にします。
分散型システムのノードには冗長性があり、いずれかのノードに障害が発生した場合でも、他のノードが障害が発生したノードの代替になれます。各ノードは水平にも垂直にもスケーリングできるため、パフォーマンスが向上します。システムに大きな負荷がかかる場合は、負荷を吸収するためにノードを追加できます。
Kubernetes と Docker の比較
Docker は市販のコンテナー化プラットフォームおよびランタイムで、開発者がコンテナーを構築、デプロイ、実行できるようにします。Docker によってコンテナー化されたアプリケーションを効率的にパッケージ化して配布できますが、Docker だけでコンテナーを大規模に実行して管理することは困難です。
Kubernetes は人気のオープンソース プラットフォームで、ネットワークで接続されたハードウェア リソースのクラスター全体でコンテナー ランタイム システムを連携させます。Kubernetes は Docker の有無にかかわらず使用できます。Docker はコンテナー ランタイムであり、Kubernetes は多くのコンテナー ランタイムからコンテナーを実行して管理するためのプラットフォームです。
構成管理
ソフトウェア構成管理は、ソフトウェア システム構成メタデータの変更を管理、整理、追跡、監視するプロセスです。バージョン管理や CI/CD インフラストラクチャと並んで一般に使用されています。
構成管理は、構成データの更新を自動で管理して監視するツールを使用して、エンジニアリング チームによる堅牢かつ安定したシステムの構築をサポートします。構成の一元的な場所に「信頼できる情報源」を作成することで、マイクロサービス アーキテクチャで分散するソフトウェアをより適切に管理するのに役立ちます。
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、ソフトウェア開発や Compass の継続的な更新についてご確認ください。