前置き
GRASPは「誰がその責任を持つの?」を決定するための9つの指針であり、データメッシュの「データプロダクト」というオブジェクトに責任を割り当てる際、まさにそのままの考え方が使えます。
GRASPは、「コンポーネントの凝集・結合」の原則を、より具体的なパターンに落とし込んだものと考えると分かりやすいと思います。
そしてそれは、データプロダクトという「コンポーネント」を設計するための、強力な判断軸となります。
では早速、各原則のメカニズム、事例、そして注意点(トレードオフ)を詳細に振れていきましょう。
1. 情報エキスパート (Information Expert)
責務は、その責務を果たすために必要な情報を(直接)持っている「エキスパート」に割り当てる。
データメッシュへの適用メカニズム
「あるデータを変換・集計するロジック(責務)は、その変換に必要な生データを所有しているドメイン(情報エキスパート)に割り当てるべき」という原則です。
これは、データメッシュの 「ドメインオーナーシップ」 の根幹をなす考え方です。
中央のデータチームがデータを集めて処理するのではなく、データを最もよく知るドメインが処理します。
事例
「月次売上レポート」を作成するという責務は、誰が持つべきか?
情報エキスパートは、注文や決済といった生のトランザクションデータを所有している「Salesドメイン」です。
よって、Salesドメインが自身のデータプロダクトとしてMonthlySalesReportを生成・提供する責務を負います。中央のアナリティクスチームではありません。
注意点(トレードオフ)
情報エキスパート(例:Salesドメイン)が、その責務を果たすための 技術力(データエンジニアリング) を持っていない可能性があります。
このギャップを埋めるのが「セルフサービス・データプラットフォーム」の役割です。
インラインコード
2. 高凝集 (High Cohesion)
責務の割り当ては、コンポーネントの凝集度が高くなるように(=関連する責務がまとまるように)行う。
データメッシュへの適用メカニズム
「データプロダクトは、単一の明確なビジネスドメイン(例:顧客、商品、注文)に関連するデータとロジックだけを持つべき」という原則です。
これは、あなたが昨日指摘したCCPやCRPの適用結果そのものです。
事例
「顧客」データプロダクトは、顧客の基本情報、連絡先、住所といった「顧客」に関するデータだけを持つべきです。(高凝集)
ここに「商品の在庫数」や「売上情報」といった、異なるコンテキストが混じり始めたら、それは「何でも屋」のデータプロダクトであり、低凝集状態です。
注意点(トレードオフ)
凝集度を高く保つ(=ドメインを細かく分ける)と、プロダクトの数は増えます。
その結果、プロダクト間の連携(JOIN)のオーバーヘッドが増加する可能性があります。
そのため、一旦論理的にはドメインごとにデータプロダクトを分けつつ、JOINといった利用時の利便性の制約を後からかけて、どのデータプロダクト同士はまとめておくかを決定しましょう。
これが、別記事で書いた、コンポーネントの凝集原則をデータプロダクトに用いた話に繋がります。
3. 疎結合 (Low Coupling)
責務の割り当ては、コンポーネント間の結合度が低くなるように行う。
データメッシュへの適用メカニズム
これはデータメッシュのスローガンそのものです。
データプロダクト同士は、互いの内部実装(どのDBを使っているか、など)に依存してはなりません。
事例
Marketingプロダクトは、Salesプロダクトが公開する「データ契約(Data Contract)」という安定したインターフェイス(APIやビュー)にのみ依存します。
Salesチームが内部のDBをPostgreSQLからSnowflakeに丸ごと入れ替えても、データ契約さえ守られていれば、Marketingプロダクトは一切影響を受けません。
これは、変更しても、契約に対して、リスコフの置換原則を満たせる場合の話です
注意点(トレードオフ)
疎結合を実現する非同期イベント連携などを採用すると、「結果整合性」 というトレードオフが必ず発生します。
「Marketingが見ているデータは5分古い」といったことが許容できるかの判断が必要です。
4. 生成者 (Creator)
オブジェクトAの生成は、Aを集約する or Aを含む or Aを密接に利用するような、オブジェクトBに割り当てる。
データメッシュへの適用メカニズム
「新しい"派生"データプロダクト(A)を生成(Create)する責務は、そのインプットとなるデータを消費し、その結果を密接に利用するドメイン(B)に割り当てるべき」ということです。
事例
Customerプロダクト(顧客情報)とSalesプロダクト(販売履歴)をインプットとして、
「優良顧客セグメント」という新しいデータプロダクトを作りたいとします。
この場合、生成者は、そのセグメント情報を密接に利用する「Marketingドメイン」です。
Marketingドメインがこの2つのプロダクトを購読し、HighValueCustomerSegmentプロダクトを生成・所有するCreatorとなります。
注意点(トレードオフ)
生成者(Marketingドメイン)は、インプットとなるCustomerやSalesプロダクトへの依存を背負うことになります。
5. コントローラ (Controller)
システム全体への入力イベントを処理する責務は、UI層の背後にあり、ユースケースを調整するオブジェクトに割り当てる。
データメッシュへの適用メカニズム
データメッシュの世界では、「システムへの入力イベント」とは「データプロダクトへのクエリ(問い合わせ)」や「ガバナンスルールの適用要求」にあたります。
コントローラは、データプロダクトの「公開インターフェイス(Output Port)」そのものです。
事例
データ利用者がSalesプロダクトのデータを要求したとします。
このリクエスト(イベント)を最初に受け取るのは、Salesプロダクトが公開しているAPIゲートウェイやSQLビュー(Output Port)です。
このコントローラが、リクエストの認証・認可(セキュリティ)を行い、正当であれば内部のデータストレージ(BigQueryなど)へのクエリ実行を委譲します。
注意点(トレードオフ)
コントローラが賢すぎると、ビジネスロジックまでをも持ち始め、ただのファサード(窓口)ではなくなってしまいます。
この時点で、コントローラは、多目的化しており、上記の高凝集を満たせなくなります。
6. 間接化 (Indirection)
2つのコンポーネントを直接結合させず、仲介者を置くことで疎結合にする。
データメッシュへの適用メカニズム
データプロダクト同士が、互いを「知っている」直接的な依存関係を持つのを防ぎます。
事例
データカタログ(発見の間接化)
A(生産者)はB(消費者)を知りません。
Aはデータカタログに自分を登録します。Bはデータカタログを検索してAを見つけます。
イベントバス(通信の間接化)
AはBにデータを直接送りません。Aはイベントバス(Kafkaなど)にイベントを公開(Publish)します。
Bはイベントバスからイベントを購読(Subscribe)します。AとBは互いの存在を知る必要がありません。
注意点(トレードオフ)
仲介者(カタログやKafka)という、新たな管理対象コンポーネントが生まれます。
ここが(高可用性ではあっても)システム全体の単一障害点になる可能性があります。
7. ポリモーフィズム (Polymorphism)
同じインターフェイス(契約)に対し、異なる実装がそれを置き換え可能であるべき。(リスコフの置換原則)
データメッシュへの適用メカニズム
データメッシュプラットフォームが、「データプロダクトとは、かくあるべし」という共通インターフェイス(例:品質メトリクスを公開せよ、カタログに登録せよ)を定義します。
各ドメインチームは、そのインターフェイスさえ満たせば、内部の実装技術(ポリモーフィズム)は自由に選択できます。
事例
プラットフォームは「/metricsエンドポイントで品質スコアを公開すること」というインターフェイスを定めます。
・Salesチームは、Snowflake + dbtでこのインターフェイスを実装します。
・IoTチームは、Kafka Streams + S3でこのインターフェイスを実装します。
注意点(トレードオフ)
技術の自由度(ポリモーフィズム)を与えすぎると、組織全体がカオスになります(通称「テクノロジー動物園」)。
「Paved Path(舗装された道)」として、推奨される技術スタック(例:SnowflakeかBigQueryのどちらか)を示すのが現実的です。
8. 変動からの保護 (Protected Variations)
変更される可能性が高い不安定な部分を特定し、その影響が他のコンテキストに及ばないように、安定したインターフェイスの壁で囲い込む。
データメッシュへの適用メカニズム
「データプロダクトの内部ロジック(不安定で、頻繁に変更される) を、データ契約(安定したインターフェイス) によってカプセル化(保護)する」ということです。
事例
「優良顧客セグメント」のロジックは、マーケティング部門の気まぐれで毎週のように変わるかもしれません(不安定)。
しかし、データプロダクトとして公開するビュー(例:v1_high_value_customers)のスキーマ(列名や型)は安定させておきます。
内部のロジックがどれだけ変わろうと、この「契約」さえ守れば、このデータを参照しているダッシュボードや他プロダクトは一切壊れません。
注意点(トレードオフ)
この「安定した契約」を設計するのが非常に困難です。
不安定な契約は、保護どころか、変更のたびに下流をすべて破壊します。
かといって、最初から設計することもできないため、最初のうちは不安定な契約による、変動リスクを意図的に引き受けるしかありません。
9. 純粋な作為 (Pure Fabrication)
ドメインの責務ではないが、システム機能上必要な責務(例:DB保存)は、ドメインオブジェクトを汚染しないよう、作為的に作った「専門家」に任せる。
データメッシュへの適用メカニズム
ドメインチーム(例:Sales)は、データ品質の計算方法やビジネスロジックには精通しているが、KubernetesやCI/CDパイプラインの専門家ではない。
そこで、これらの非ドメイン責務(インフラ運用)を、ドメインチームから分離し、作為的に作られた 「セルフサービス・データプラットフォーム」 に任せます。
データエンジニアリング文脈でいう、プラットフォームチームのことを指します。
事例
Salesチームは、データ変換ロジックをSQLで書くだけ。
それをGitにプッシュすると、Pure Fabrication(データプラットフォーム)が自動でテスト、コンテナ化、Airflowでのスケジューリング、品質スキャン、カタログ登録を全部やってくれます。
注意点(トレードオフ)
この「プラットフォーム」自体が、巨大で複雑なモノリスとなり、新たなボトルネックになる可能性があります。