目次を表示する

DCB(Dynamic Consistency Boundary)

DCB と集約の共存 ── 「どちらか」ではなく「どちらも」

DCB と集約の共存 ── 「どちらか」ではなく「どちらも」


DCBと集約の共存 — 使い分けと移行パターン

DCB は集約を殺すのか?

Sara Pellegrini の講演タイトル “Kill Aggregate!” はインパクトがあるが、DCB の提唱者たち自身が明確に述べている:

DCB は集約を否定するのではなく、その進化形である。

DCB と集約は相互に排他的ではなく、補完的だ。


使い分けの指針

集約が適しているケース

1. 不変条件が単一エンティティに閉じている
   → Order 集約内で合計金額を検証するなど
   → DCB を使うまでもない。集約がシンプルで十分。

2. パフォーマンスがクリティカル
   → DCB の条件付き書き込みはクエリを2回実行する(読み取り + 検証)
   → 高頻度の書き込みでは集約のストリームバージョンの方が軽量

3. チームが DDD の集約に慣れている
   → 学習コストとの兼ね合い
   → 既存コードベースとの一貫性

4. 状態遷移が集約内で完結する
   → 注文のステータス遷移(作成→確認→出荷→完了)など
   → 集約の内部状態として自然にモデリングできる

DCB が適しているケース

1. 不変条件が複数エンティティにまたがる
   → 講座の定員 + 受講者の上限(Ch.5 のケース1)
   → Saga を避けて即時一貫性が欲しい

2. グローバルな一意性制約
   → メールアドレスの重複防止
   → 集約の外にある制約

3. 集約の境界が頻繁に変わる(ドメインが進化中)
   → スタートアップの初期フェーズなど
   → タグとクエリの変更だけで境界を再定義できる

4. 不要なシリアライゼーションを避けたい
   → 同じ集約への書き込みが全て直列化される問題
   → 関連する操作だけが競合するようにしたい

共存パターン

パターン1: コアドメインは集約、クロスカットは DCB

集約で管理:
  Order 集約: 注文の作成・明細追加・ステータス管理
  → 不変条件が集約内で完結

DCB で管理:
  「同一ユーザーの未払い注文は3件まで」
  → User と Order にまたがる制約
  → タグ ["user:U1", "order:O1"] で横断クエリ

パターン2: 既存の集約を段階的に DCB に移行

Phase 1: 既存の集約ベースのイベントストアはそのまま
Phase 2: 新しいクロス集約の制約を DCB で追加
Phase 3: 不要になった Saga を DCB に置き換え
Phase 4: (必要なら)集約のストリーム構造をフラット化

パターン3: 境界づけられたコンテキスト内で DCB、コンテキスト間は非同期

コンテキスト内(DCB で即時一貫性):
  講座管理コンテキスト内の「受講者登録」
  → 定員と受講上限を DCB で同時に保証

コンテキスト間(イベントで結果整合性):
  講座管理 → 請求コンテキスト
  → StudentRegistered イベントをサブスクライブ
  → 請求レコードを作成
  → 従来通りの結果整合性で十分

DCB の制約と注意点

1. イベントストアの対応が必要

DCB は「タグによるフィルタリング」と「条件付き書き込み」をネイティブにサポートするイベントストアが必要。

DCB 対応のイベントストア:
  - EventSourcingDB(DCB の仕様策定者が開発)
  - UmaDB(DCB ネイティブ対応)
  - 自作実装(PostgreSQL + タグテーブルで構築可能)

従来のイベントストア(そのままでは DCB 不可):
  - EventStoreDB(ストリームベース)
  - Axon Server(集約ベース)
  → アダプターレイヤーで対応可能な場合もある

2. クエリのパフォーマンス

集約ベース:
  ストリームの末尾から読むだけ → O(1) に近い

DCB ベース:
  タグ + タイプでフィルタして全件スキャン → インデックスが必要
  → 適切なインデックス設計がないと大量イベント時にパフォーマンス劣化

対策:
  - タグとイベントタイプの複合インデックス
  - スナップショット(Projection のキャッシュ)
  - タグの設計でクエリ範囲を限定(日付タグなど)

3. 学習コスト

集約は DDD の中核概念として広く知られ、書籍やコミュニティの蓄積が厚い。
DCB は 2023年に提唱された新しい概念で、実践事例やパターンの蓄積はまだ少ない。

→ チームへの導入は段階的に行うのが現実的
→ まずクロス集約の制約がある具体的な問題に DCB を適用し、効果を実感してから拡大

意思決定フローチャート

Q: 不変条件は単一の集約に閉じているか?
  YES → 集約で十分

  NO → Q: 結果整合性は許容できるか?
    YES → Saga / プロセスマネージャー

    NO → Q: イベントソーシングを使っているか?
      YES → DCB が最適な選択肢
      NO  → Q: イベントソーシングの導入は検討できるか?
        YES → DCB の導入を検討
        NO  → ドメインサービス + 分散ロック(従来型)

まとめ

観点集約DCB
成熟度高い(2003年〜)低い(2023年〜)
学習リソース豊富まだ少ない
単一エンティティの制約◎ 最適○ 可能だがオーバーキル
クロスエンティティの制約△ Saga が必要◎ 本領
パフォーマンス○ 軽量△ クエリコストあり
柔軟性△ 境界の変更が困難◎ タグとクエリで柔軟
イベントストアの要件汎用的専用対応が必要