Topics マイクロサービス

マイクロサービスとは?


マイクロサービスは、アプリケーションが数多くの小さな部分に分割されて独立して動作する最先端のソフトウェアアーキテクチャ設計であり、それを活用することでチームはより迅速に大規模なスケールでイノベーションを起こすことができます。

マイクロサービスの説明

多くの企業は、モノリシックなアプリケーションアーキテクチャを使用して独自のサービスを構築しています。これは、すべてのアーキテクチャコンポーネントが単一のインフラストラクチャ内に存在しているということです。開発者がマイクロサービスアーキテクチャを使用すると、すべてのシステムコンポーネントが分割され、個別のサービスとしてデプロイされます。サービスはAPI呼び出しを使用して互いに通信します。

その結果、迅速かつコスト効率の高い、アップグレードやプラグイン可能なアーキテクチャが実現します。スケールアップする必要がある部分がシステムの一部分だけの場合は、システム全体をスケールアップするよりも簡単でコストもかかりません。開発者はコンテナオーケストレーションツールとKubernetesを使い、処理能力や必要なその他のリソースを適切に割り当てます。こうしたサービスは、クラウドベースのサーバー上のコンテナで実行されます。

モノリシックなアーキテクチャとマイクロサービスアーキテクチャ

マイクロサービスアーキテクチャは、従来のモノリシックなアプリケーションアーキテクチャと比較するとわかりやすく理解できます。モノリシックなアーキテクチャスタイルでは、個々のコンポーネントはすべて単一のユニットを構成する一部です。すべてが同時に開発、デプロイ、スケーリングされます。チームは、単一のランタイムと言語でアプリケーション全体を作成する必要があります。

この場合、異なるアプリのコンポーネントに取り組む異なるチーム同士、お互いの作業に影響を与えないよう配慮しなければなりません。例えば、アプリの一部分が1.8など特定のバージョンを必要とするモジュールに依存しており、別のチームは同じモジュールを必要としながらも1.8は別の依存関係と互換性がなくバージョン1.7が必要となる、といった状況が発生したとします。モノリシックなアプリでは、どちらか一つを選択する必要があります。同様に、モノリシックなアプリはすべてを単一アプリケーションとしてデプロイするため、コードをテストしてデプロイしなければなりません。

マイクロサービスでは各コンポーネントがAPI呼び出しを介して互いに通信するサービスとして分割され、個別にデプロイされます。

monolith-vs-microservices-large

マイクロサービスのコアコンポーネント

マイクロサービスは、アプリケーションの信頼性とデプロイ速度を最大化します。これは、かつてないほどのペースで進化を続けている市場においては特に重要です。マイクロサービスのコンテナ化されたアーキテクチャは、環境を変更または中断することなくアプリをどこにでも移動し、速度を向上させ、ダウンタイムを短縮できます。

マイクロサービスアーキテクチャのコアコンポーネントを詳しく見てみましょう。

  1. クライアント:クライアントアプリは通常複数のマイクロサービスから機能を使用する必要があり、頻繁な更新が必要です。
  2. データベース:サービスAPIは、異なるスタックのプロセス間通信をサポートするオールリモートサービスを伝送することにより、マイクロサービスデータベースを更新します。
  3. ** APIゲートウェイ**:APIゲートウェイはマイクロサービス設計パターンであり、ルーティングリクエストとプロトコル変換に不可欠な単一のアプリエントリポイントです。
  4. ** Identity Provider**:IDマイクロサービスは、サーバー間およびユーザー主導のIDデータへのアクセスを許可する必要があります。
  5. メッセージングフォーマット:マイクロサービスは、同期または非同期のマイクロサービスアーキテクチャパターンで通信します。
  6. 静的コンテンツ:クライアントはクラウドベースのストレージサービスとコンテンツ配信ネットワークを介して静的コンテンツを受信します。
  7. 管理:このコンポーネントを使用すると、ビジネスユーザーは実行時にサービスを構成できます。
  8. サービスディスカバリ:サービスをリクエストするには、サービス検出メカニズムが必要です。

マイクロサービスの特徴

Martin Fowlerのマイクロサービスに関する代表的な記事では、ほとんどのマイクロサービスアーキテクチャに共通する9つのコンポーネントが定義されています。

1. サービスを介したコンポーネント化

本質的に、マイクロサービスアーキテクチャはコンポーネントサービスに分類されます。そのため、各サービスは、環境に影響を与えることなく、個別に指定、デプロイ、改良、および再デプロイできます。これにより、アプリ全体を再デプロイする代わりにサービスを変更することが通常可能となります。

2. ビジネス能力を中心に整理

モノリシックなアプローチでは、技術チームはUI、データベース、サーバー側のロジックなどの技術関連の機能に別々に焦点を当てていました。一方、マイクロサービスではビジネス機能と優先順位を中心に機能横断型チームを編成します。その後、チームはメッセージバスを使用して通信する個々のサービスに基づき、製品を設計できます。

3. プロジェクトではない製品

かつて、アプリ開発者は、チームにソフトウェアを構築させ、完成後に保守組織に渡すというプロジェクトモデルを使用していました。マイクロサービスアーキテクチャは、製品をライフタイムにわたって所有するチームに適しています。これにより開発者は新しい方法で製品とやり取りし、本番環境での動作を確認してユーザーとの接触を増やすことができます。また、エンジニアと企業はコラボレーションを強化し、お互いの分野を理解できるようになります。

4. スマートエンドポイントとダムパイプ

マイクロサービスには従来のUNIXシステムと多くの共通点があり、リクエストを受け取り、処理し、適切な応答を生成します。Fowlerはこのアプローチを「スマートエンドポイントとダムパイプ」と呼んでいます。インフラストラクチャは通常、メッセージルーターとしてのみ機能するため、「ダム (Dumb)」であり、すべてのスマートな部分はエンドポイントを生成および使用するエンドポイントに存在します。

5. 分散型ガバナンス

単一技術のプラットフォームは多くの場合過剰な標準化につながるため、分散型ガバナンスはマイクロサービスアーキテクチャのデフォルト構造です。モノリスとは対照的に、マイクロサービスの主な利点は、さまざまなプログラミング言語と技術を最も適した場所で使用できることにあります。例えば、Spring Bootのマイクロサービスはある特定のコンポーネントのアプリを構築し、Spring Cloudは別のコンポーネントを構成できます。

6. 分散型データ管理

ほとんどのマイクロサービスでは、各コンポーネントは分散型データ管理から独自のデータベースを管理できます。共有データベースのアップグレードの時間のかかるタスクを消去しながら、特定のプロジェクトに最適なデータストアをいつでも使用できます。

7. インフラストラクチャの自動化

CI/CDの専門家は、マイクロサービスでインフラストラクチャの自動化を使用しています。これは開発者のワークロードを軽減し、デプロイタイムラインの効率を大幅に向上させます。

8. 失敗を前提とした設計

優れたビジネスと同様、マイクロサービスは回復力を念頭に置いています。ユニークで多様なサービスはコミュニケーションを取らなければならない以上、失敗する可能性は高まります。これは、モノリスと比較してより複雑になるマイクロサービスの主な欠点です。

障害が消費者に影響しないよう、高度なモニタリングとログの設定が必要です。エンジニアにとってはより多くの作業が必要となりますが、障害に対応する機能が十分に発達していることを意味するものでもあります。

9. 進歩的なデザイン

ペースの速いハイテク業界では、進歩的なデザインはもはや贅沢品ではなく必要不可欠です。毎年新しい電子デバイスが市場で発売されている中で、アプリはそうしたデバイスに対応しなければなりません。マイクロサービスの分解デザインでは、再デプロイすることなくアプリを一新できます。

GOTOのプレゼンテーションでは、Fowler氏がこうした各コンポーネントについて詳しく説明しています。

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

マイクロサービスのデザインは機敏で柔軟性があり、メンテナンス、修理、更新のダウンタイムを最小限に抑えることができます。

マイクロサービスの主なユースケースは次のとおりです。

1. データ処理

マイクロサービスアーキテクチャで実行されるアプリは、短い時間でより多くの同時リクエストを処理できるため、効率が向上します。

2. ウェブサイトの移行

マイクロサービスを使うとサイトのUI、構造、ドメインのサイト移行によるダウンタイムを回避できます。

3. 大規模なメディア

プラットフォームは、エラーや遅延なしでさまざまなサブドメインの大量の数のリクエストを処理できます。

4. 請求書とトランザクション

マイクロサービスはアプリの障害を低減してトランザクションをより堅牢にするようサポートを提供し、企業は再デプロイすることなくスケールアップできます。

5. 古いシステム

時代遅れのモノリスをアップデートするのではなく、新しいコンテナ化されたシステムを開発するほうが効率的かつ効果的です。

マイクロサービスアーキテクチャのメリット

[マイクロサービスアーキテクチャを実装する]か(/blog/2019/06/17/strategies-microservices-architecture/)、旧モノリスをマイクロサービスに分解すると、多くの場合、シンプルさは失われるものの開発速度、柔軟性、スケーラビリティが向上します。モノリスはビルド、デプロイ、デバッグは簡単ですが、拡張は困難です。 マイクロサービスアーキテクチャはより複雑ですが、エンジニアは次のような利点を享受できます。

独立したデプロイ

各マイクロサービスが正しく機能するには、フルスタックである必要があります。DevOpsチームは、環境全体に影響を与えることなく単一のマイクロサービス上のエラーを簡単に修正できます。

スケーラビリティ

モノリスではすべてのアプリケーション要素を同時に拡張する必要があるため、拡張が必要のないところも拡張されます。独立したコンポーネントを使用すると、各マイクロサービスは負荷に応じて個別に拡張できます。マイクロサービスアーキテクチャを使用してアプリを構築しているチームは、アプリの残りの部分を中断することなく各サービスを変更できます。プログラマーは並行してホットサービスの特定、機能の更新、選択したサービスの拡張の作業をすることができます。

技術スタックの自由

アプリケーション全体で単一の技術スタックに依存することは、モノリシックなアーキテクチャの中でも制限的な機能です。マイクロサービスを使用すると、開発者は適切なプログラミング言語、フレームワーク、データベース、ジョブのフロントエンドとバックエンドツールを使用してアプリをビルドできます。これにより、さまざまな用途に使えるものの、一芸に秀でていない標準化されたスタックに甘んじる必要がなくなります。

障害の隔離

障害が発生すると、たとえそれが1件でも、モノリスアプリ全体が影響を受けてしまいます。マイクロサービスはコンポーネントに障害を隔離するため、アプリケーション全体にその余波が及ぶことはありません。1件のマイクロサービスに障害が発生した場合でも、アプリケーションの残りの部分はオンラインのままにすることができます。メンテナンス担当者が問題を特定して迅速に対処できるよう、各マイクロサービスの状態を何らかのダッシュボードで表示することをおすすめします。問題の修正は、オンデマンドの仮想化でスライダーを動かして追加のサーバーをオンラインにするなど、簡単に行うことができます。

生産性

マイクロサービスはサイロを減らし、各地に分散するリモートワーカーが複数部署をまたいで作業するチームワークを強化します。デベロッパーが他の要素を処理しながら品質管理を効率化している間に、独立したテストを完了できます。マイクロサービスアーキテクチャを使うと、エンジニアはスケーラブルで回復力のあるサービスを構築でき、デプロイが容易になります。

継続的なデリバリーでは、異なるバージョンのサービスをさまざまなサブセットのユーザーが利用できるようにして機能をテストできます。既存のモノリシックなソフトウェアを使用している企業でさえ、マイクロサービスでスタックを一新する方法を模索しています。

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

マイクロサービスの利点は、回復力とスケーラビリティです。しかし、小規模な独立サービスとの連携には多くの場合適していません。

注意すべき点を次にまとめました。

  • 複雑さ:マイクロサービスの数が増えるほど、管理とオーケストレーションが複雑になる可能性があります。これに対応するには、インフラストラクチャの自動化とCI/CDが重要となります。
  • データの一貫性:マイクロサービスは、独自のデータを保持しながら広範なシステム内で連携して機能します。これは、複数のサービスに共通のデータが存在することを意味します。共通データに変更がある場合は、毎回すべてのコンシューマーサービスで変更を行う必要があります。
  • 通信障害のリスク:処理中の関数呼び出しとは異なり、他のサービスへの呼び出しはネットワーク上でエラーとなる可能性があります。これはマイクロサービスアーキテクチャの回復力とスケーラビリティを実現するために必要なトレードオフです。回復力をさらに高めるには、バルクヘッドとサーキットブレーカーパターンを使用できます。

マイクロサービスのビジネスバリュー

現在マイクロサービスアーキテクチャはビジネスの世界で広く普及しており、多くの企業はすでにマイクロサービスを利用しているか、まもなく利用を開始する予定です。マイクロサービスはコストを削減し、エンジニアリング上の問題を軽減してダウンタイムを最小限に抑えます。

あらゆる規模の企業にとって、今こそ導入の時期です。アーキテクチャをモノリシックな構造からマイクロサービスの構造に移行するタイミングは、まさに今です。長期的なコストの節約、ビジネスの効率的な運営、顧客の満足度向上が実現します。マイクロサービスは将来のアーキテクチャです。マイクロサービスをビジネスに活用する方法を今すぐ確認しましょう。

マイクロサービスにはモノリスに比べて多くのビジネス上のメリットがあり、開発者とビジネスリーダー間の協力関係を促進し、優れた結果をもたらします。マイクロサービスでできること

  1. より速いペースでのイノベーション: 進歩的な設計により、アプリケーションコンポーネントを簡単に変更およびアップグレードできます。
  2. 安定性・回復力の向上:モノリシックなアーキテクチャとは異なり、マイクロサービスは独立しているため、開発者は一度に1つのコンポーネント以外を更新する必要はなく、実質的にダウンタイムを排除します。
  3. スケーラビリティ:開発チームは環境全体に影響を与えることなく単一のコンポーネントに取り組むことができ、ビジネスニーズにさらに対応できるようになります。
  4. コストの削減と収益の向上:マイクロサービスは全体的なインフラをより少なくし、ダウンタイムを最小限に抑えて安定性と顧客体験を向上します。さらに、プロトタイプからデプロイまでの期間も短縮できます。

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

ますます多くの企業や個人がSaaSアプリケーションを使用し、アプリケーション開発の複雑さが増すにつれて、可用性とスケーラビリティのニーズはかつてないほど高まっています。スケーラブルなデータベース、継続的なデリバリー、観測性ツール、データとイベントのストリーミングなどのサポートサービスも急速に成長しています。

エンジニアはこうした課題を克服するためのスキルを継続的に習得しています。一方で、マイクロサービスアーキテクチャとネットワークインフラストラクチャはまだ発展途上にあります。マイクロサービスアプリケーションは今後メンテナンスと開発が容易になり、ビジネスにより多くの価値を提供するようになっていくでしょう。

マイクロサービスをGitLabで使用する

GitLabを使用すると、コードをコミットし、必要なツールを単一アプリケーションにまとめることができます。すべてのプロジェクトに10個ものツールを組み合わせる必要はもうありません。

DevOpsプラットフォームを使用してマイクロサービスを管理すると、情報のサイロ化を回避できます。チーム間の可視性を高め、ハンドオフをよりシンプルにすることで、プロジェクトのデプロイと安定性を確保しつつDevOpsのライフサイクルを短縮できます。

GitLabは、次のようにマイクロサービスのオーケストレーションを簡単にします。

  1. ビルトインCI/CD:Fowlerが指摘するように、マイクロサービスには継続的なデリバリーとデプロイを使用したインフラストラクチャの自動化が必要です。GitLabに搭載されているCI/CDは、マイクロサービスを活用しようとしている企業に最適です。
  2. ビルトインコンテナレジストリと堅牢なKubernetesインテグレーション:マイクロサービスアーキテクチャはレガシー仮想マシン(VM)テクノロジーで使用でき、コンテナとKubernetesの活用でマイクロサービスの構築が大幅に簡単になります。GitLabはKubernetesとスムーズに連携するよう設計されています。
  3. ビルトインモニタリング:モニタリングは、オペレーションの成功に不可欠です。Prometheusを活用したモニタリング機能により、GitLabはマイクロサービスにとって最適な場を提供します。
  4. マルチプロジェクトパイプライン:GitLabはプロジェクト間の依存関係を持つパイプラインの実行をサポートしているため、さまざまなリポジトリ間のやり取りを簡単に管理できます。
  5. モノレポのサポートと特定のディレクトリ内のコードが変更された場合にのみパイプラインを実行する機能:リポジトリ全体でパイプラインを実行する無駄な時間が削減されます。
  6. グループレベルのKubernetesクラスター:複数のプロジェクトを単一のKubernetesクラスターと統合できます。

GitLabの主なメリット

GitLabは、コラボレーションと改善を求めているトップクラスの開発者に選ばれている単一のDevOpsプラットフォームです。 GitLabの主なメリットをご覧ください。

*アプリの切り替えが不要:開発者は常にコンテキストの切り替えを行う必要がなくなり、タスクに集中しやすくなります。さらにイシューを作業に簡単にリンクし、生産性を向上させ、ソフトウェアエンジニアが経験する主要な問題を排除できます。

  • ワークロードを軽減:GitLabではタスクを簡単に自動化できるため、重要で結果が求められる仕事に集中できます。繰り返し同じ作業ばかりしていると、開発者のやる気は失われてしまいます。作業を自動化することで、仕事の満足度と生産性が向上します。
  • コラボレーションと透明性:コラボレーションと透明性は、GitLabプラットフォームの主要な特徴です。開発者と顧客の関係が透明であれば、迅速に協力し、簡単に修正が行え、コミュニケーションも少なくて済みます。
  • コミュニティの一員となる:すべての開発者は、アプリ改善のためにGitLabのオープンソースコアに自由にコントリビュートできます。GitLabコミュニティは親しみやすくいつも新しいメンバーを歓迎しており、新しいことを学べるほか、活発に意見が交わされています。
  • 最先端のソフトウェア開発方法を学ぶ:コーディングとアプリケーション開発は、世界で最も急速に成長している分野の1つです。GitLabはコミュニティに最新の開発情報を提供しているため、ベストプラクティスを学ぶことができます。

クラウドネイティブの変革を始める

単一アプリケーションでコードのビルド、テスト、デプロイ、モニタリングを行いましょう。

GitLabツールとインテグレーションを活用した、Ask Media GroupのオンプレミスサーバーからAWSクラウドへの移行方法がテーマです。参加して成功事例から学びましょう。

実際に体感してみませんか?

統合されたDevSecOpsプラットフォームによってチームで実現できることをご確認ください。