マイクロサービス

1 つの大きなアプリケーションを複数の小さなサービスに分割し、それぞれが独立してデプロイ・スケール可能な状態で協調動作するアーキテクチャパターン

アーキテクチャ分散システム

マイクロサービスとは

マイクロサービスは、1 つの大きなアプリケーションを複数の小さなサービスに分割し、それぞれが独立してデプロイ・スケール可能な状態で協調動作するアーキテクチャパターンである。各サービスは特定のビジネスドメインに対応し、API を通じて他のサービスと通信する。

モノリシックアーキテクチャでは、すべての機能が 1 つのコードベースに集約されるため、変更の影響範囲が広がりやすく、デプロイのたびにアプリケーション全体を再デプロイする必要がある。マイクロサービスはこの課題を解決し、チームごとに独立した開発・デプロイサイクルを実現する。

マイクロサービスの特性

Martin Fowler と James Lewis が定義した特性が広く参照されている。

  • サービスによるコンポーネント化: ライブラリではなく、独立したプロセスとしてデプロイされるサービスで構成する
  • ビジネス機能に基づく組織化: 技術レイヤー (フロントエンド、バックエンド、DB) ではなく、ビジネス機能 (注文、決済、在庫) でチームを編成する
  • スマートエンドポイントとダムパイプ: ビジネスロジックはサービス内に置き、通信インフラ (メッセージバス) はシンプルに保つ
  • 分散データ管理: 各サービスが独自のデータストアを持つ (Database per Service)
  • インフラの自動化: CI/CD パイプライン、コンテナ、IaC による自動化が前提

モノリスとの比較

観点 モノリス マイクロサービス
デプロイ 全体を一括デプロイ サービス単位で独立デプロイ
スケーリング アプリケーション全体をスケール サービス単位でスケール
技術選択 統一された技術スタック サービスごとに最適な技術を選択可能
データ整合性 トランザクションで保証 結果整合性が基本
運用の複雑さ 低い 高い (監視、デバッグ、ネットワーク)
開発の初速 速い 遅い (インフラ整備が必要)

実務での判断ポイント

チーム規模が 10 人以下の小規模プロジェクトでは、マイクロサービスの運用コストがメリットを上回ることが多い。サービス間通信のレイテンシ、分散トランザクションの複雑さ、監視基盤の整備、サービスメッシュの運用など、モノリスにはない運用負荷が発生する。

「モノリスファースト」のアプローチ - まずモノリスで構築し、ドメインの理解が深まった段階でサービスを分割する - が実務的に推奨されることが多い。

「マイクロサービスアーキテクチャ」(Sam Newman 著) が定番の入門書として位置づけられている。「マイクロサービスパターン」(Chris Richardson 著) は実装パターンを網羅的に解説している。

AWS でのマイクロサービス

パターン 構成
Lambda ベース API Gateway → Lambda → DynamoDB
コンテナベース ALB → ECS Fargate → Aurora
イベント駆動 EventBridge → Lambda → SQS

サービス間通信

// EventBridge でイベントを発行 (疎結合)
await eb.send(new PutEventsCommand({
  Entries: [{ Source: 'order-service', DetailType: 'OrderCreated', Detail: JSON.stringify(order) }],
}));

理論と実装の両面から学ぶなら関連書籍が参考になる。

関連用語