目次
読了時間: 約9分 | 文字数: 約3,200字
Netflix が 2009年にモノリスからマイクロサービスへ移行した事例は、業界に大きな影響を与えた。しかし、Netflix がマイクロサービスを必要としたのは、数億人のユーザーに99.99%の可用性を提供するためだ。あなたのプロジェクトが同じ状況にあるとは限らない。
モノリスとマイクロサービス
モノリス
すべての機能が1つのプロセスとして動作する。デバッグが容易、トランザクション管理がシンプル、テストが書きやすい。
マイクロサービス
ビジネスドメインに沿って分割された小さなサービスの集合。各サービスは独立してデプロイ可能で、独自のデータストアを持つ。
設計原則
単一責任の原則
各サービスは1つのビジネス機能を担当する。「このサービスが何をするか」を1文で説明できないなら、分割が不適切だ。
境界づけられたコンテキスト
DDD の概念。各サービスは自身のドメインモデルを持ち、外部とは API で通信する。
データの所有権
各サービスは自身のデータベースを所有する。他のサービスの DB に直接アクセスすることは禁止。
サービス間通信
同期通信(REST / gRPC)
シンプルだが、呼び出し先がダウンすると呼び出し元もブロックされる。サーキットブレーカーの実装が必要。
非同期通信(メッセージキュー)
サービス間の結合度が低い。Kafka や RabbitMQ を介してメッセージをやり取りする。
イベント駆動アーキテクチャ
サービスがイベントを発行し、興味のあるサービスが購読する。新しいサービスの追加が、既存サービスの変更なしにできる。
分散システムの課題
分散トランザクション
複数サービスにまたがる ACID 保証は事実上不可能。Saga パターンで補償トランザクションを使う。
サービスディスカバリ
Consul や Kubernetes の DNS でサービスを動的に発見する。
観測可能性
分散トレーシング、集約ログ、メトリクスの3本柱が必要。
マイクロサービスにすべきか
分割してよい兆候: チーム間の調整コストがデプロイを遅延させている、特定の機能だけスケールしたい。
分割すべきでない兆候: チームが10人以下、ドメインの境界がまだ見えていない、運用基盤が未整備。
So What?——実務への応用
- モノリスファーストで始める: ドメインを理解してから分割する。早すぎる分割は「分散モノリス」を招く
- 通信は非同期を基本とする: 障害の伝播を防ぐ。同期通信はサーキットブレーカーで保護
- Observability を最初から組み込む: 後から追加するのは困難
- 組織構造とアーキテクチャを合わせる: コンウェイの法則——サービスの境界はチームの境界と一致させる
マイクロサービスは技術的な問題ではなく組織的な問題を解決するアーキテクチャだ。その代償を払う理由があるかどうかが、導入判断の本質だ。
参考リンク
- Microservices.io — マイクロサービスパターンの包括的カタログ
- Building Microservices(Sam Newman) — マイクロサービス設計の定番書
- Martin Fowler - Microservices — マイクロサービスの定義と解説
- Netflix Tech Blog — Netflix のマイクロサービス事例
免責事項 — 掲載情報は執筆時点のものです。料金・機能は変更される場合があります。最新情報は各公式サイトをご確認ください。