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