なぜ必要なのか
家族が行事案内を保存し、参加費を払う学校アプリを作るとします。急ぎのボランティアタグは課金の公開を待てません。一チームが独立更新のため通信の調整を引き受けます。内部モジュールだけなら更新は共通です。
どう解決するのか
- 一チームがカタログ・ライブラリ・課金を各v1で運用。保存した学校行事の案内はタグなし。
- 互換性のあるタグ機能をライブラリv2だけに配布。カタログ・課金はv1のまま。
- ライブラリがネットワークでカタログを参照し、自分の保存先に
ボランティアを記録。書き込み前のタイムアウトはタグなし。失敗を伝え、復旧後に再試行。
説明用の架空の例
一つの機能だけをリリース
学校行事アプリ · 一チーム · 学校行事にボランティアタグなし
変更:ライブラリにタグを追加。課金の動作は同じ。
契約の互換性を維持:新しいリリースはライブラリのみ。
デプロイ単位 · 1
カタログ
v1 → v1動作は同じ
所有する保存先カタログデプロイ単位 · 2
ライブラリ
v1 → v2タグ機能を追加
所有する保存先ライブラリデプロイ単位 · 3
課金
v1 → v1動作は同じ
所有する保存先課金
ネットワーク参照 · タグの書き込み前
ライブラリ → カタログ API
遠隔応答は保証されません。課金はこの参照経路に参加しません。
1 · 成功
参照成功 → ボランティアを記録 → 学校行事のタグはボランティア。
2 · カタログ参照タイムアウト
書き込み前に参照失敗 → タグなし。失敗を伝え、復旧後に再試行。
各サービスがデータを所有し、他サービスのテーブルを直接読みません。独立リリースでも監視と障害処理が必要で、依存先の障害は波及し得ます。
所有権の枠はアクセス規則を示し、データベースのマシン数を示しません。
独立配布で自動的に障害が隔離されるわけではありません。同期のカタログ依存はライブラリを止める場合があります。時間制限と再試行を定めます。
どんな考え方なのか
マイクロサービスは明示的な契約とデータ所有権を持ち、独立してデプロイする業務機能別サービスです。プロセス分割だけでは独立性は生まれません。Lewis・Fowler
ネットワーク障害とサービス間データの調整が必要です。他の機能はモジュラーモノリスに残せます。
この選択を話し合う
コメントは全言語で共有。投稿にはGitHubログインが必要です。