なぜ必要なのか
機能同士の干渉は増えたが、別サービスにすると運用負担が大きい。一つの配布単位の中で境界を作りたい場面です。
どう解決するのか
- 架空の読書アプリ。一チーム、アプリv1にカタログ・ライブラリ・課金を含む。A17はタグなし。
- ライブラリ所有のテーブルにタグ保存を追加し、アプリv2をデプロイ。課金の動作は同じ。一つのDBでもテーブルはモジュール別に所有し、他モジュールの直接アクセスは禁止。
- ライブラリがカタログAPIをプロセス内で呼び、
travelを記録。参照失敗ならタグなしのまま。復旧後に再試行。
説明用の架空の例
内部の契約、共通のリリース
読書アプリ · 一チーム · A17はタグなし
変更:ライブラリにタグを追加。課金の動作は同じ。
デプロイ単位 · 1
アプリv1 → アプリv2カタログ
API記事の参照所有する内部実装カタログ所有のテーブルライブラリ
タグ機能を追加APIA17のタグを設定:travel所有する内部実装ライブラリ所有のテーブル+タグ項目課金
API動作は同じ所有する内部実装課金所有のテーブル
ライブラリ → カタログ API · プロセス内呼び出し
他モジュールのテーブルに直接アクセスしない。呼び出しはそのAPIを通す。
一つの共有データベース、テーブルの所有権は分離。ライブラリの保存変更も共通リリースに含む。
- 参照成功 → travelを記録 → A17のタグはtravel。
- 書き込み前に参照失敗 → タグなし。失敗を伝え、復旧後に再試行。
モノリスの一種:リリースとプロセス障害を共有。API境界はコード規則とテストで守り、フォルダーだけに頼りません。
所有権の枠はアクセス規則を示し、データベースのマシン数を示しません。
どんな考え方なのか
モジュラーモノリスは一つのデプロイ内に明示的な境界を設けます。モジュールAPIが所有する内部実装を保護します。引き続きモノリスです。Fowler
フォルダー分け以上の境界強制が必要で、リリース・プロセス障害は共有します。内部にヘキサゴナルのポートを置けます。
この選択を話し合う
コメントは全言語で共有。投稿にはGitHubログインが必要です。