{
 "title": "小売チェーン データ基盤（GCP）3D構成図",
 "floors": [
  {
   "id": "F0",
   "z": 0,
   "name": "① データソース",
   "sub": "店舗・EC・アプリ・オンプレ・取引先"
  },
  {
   "id": "F1",
   "z": 4.5,
   "name": "② インジェスト",
   "sub": "受け口（秒単位 / 日次）"
  },
  {
   "id": "F2",
   "z": 9,
   "name": "③ 処理",
   "sub": "ストリーミング整形 / 大規模変換"
  },
  {
   "id": "F3",
   "z": 13.5,
   "name": "④ 蓄積",
   "sub": "raw → staging → mart"
  },
  {
   "id": "F4",
   "z": 18,
   "name": "⑤ 活用",
   "sub": "BI・ML・API・外部連携"
  }
 ],
 "lanes": [
  {
   "id": "rt",
   "name": "リアルタイム経路（秒単位）",
   "y": 5.625
  },
  {
   "id": "batch",
   "name": "バッチ経路（日次）",
   "y": -5.625
  }
 ],
 "nodes": [
  {
   "id": "POS",
   "label": "店舗POS",
   "svc": "Source",
   "floor": "F0",
   "x": -10.0,
   "y": 6.25,
   "kind": "source",
   "desc": "全国の店舗レジ。売上イベントを秒単位で送信。"
  },
  {
   "id": "EC",
   "label": "ECサイト",
   "svc": "Source",
   "floor": "F0",
   "x": -5.625,
   "y": 6.25,
   "kind": "source",
   "desc": "Webの行動・注文イベント。"
  },
  {
   "id": "APP",
   "label": "モバイルアプリ",
   "svc": "Source",
   "floor": "F0",
   "x": -1.25,
   "y": 7.5,
   "kind": "source",
   "desc": "アプリの利用ログ。"
  },
  {
   "id": "ONP",
   "label": "オンプレ基幹DB",
   "svc": "Source",
   "floor": "F0",
   "x": -10.0,
   "y": -6.25,
   "kind": "source",
   "desc": "商品・在庫マスタなど。Interconnect経由で連携。"
  },
  {
   "id": "SFTP",
   "label": "取引先SFTP",
   "svc": "Source",
   "floor": "F0",
   "x": -5.625,
   "y": -6.25,
   "kind": "source",
   "desc": "取引先から日次で届くファイル。"
  },
  {
   "id": "PS1",
   "label": "pos-events",
   "svc": "Pub/Sub",
   "floor": "F1",
   "x": -10.0,
   "y": 5.0,
   "kind": "ingest",
   "desc": "POSイベントの受け口。発注APIのイベントもここに戻ってくる。"
  },
  {
   "id": "PS2",
   "label": "web-events",
   "svc": "Pub/Sub",
   "floor": "F1",
   "x": -5.625,
   "y": 5.0,
   "kind": "ingest",
   "desc": "ECイベントの受け口。"
  },
  {
   "id": "FB",
   "label": "Firebase Analytics",
   "svc": "Firebase",
   "floor": "F1",
   "x": -1.25,
   "y": 6.875,
   "kind": "ingest",
   "desc": "アプリログをBigQueryへ直接エクスポート。"
  },
  {
   "id": "DS",
   "label": "Datastream",
   "svc": "CDC",
   "floor": "F1",
   "x": -10.0,
   "y": -5.0,
   "kind": "ingest",
   "desc": "基幹DBの変更差分（CDC）を取り込む。"
  },
  {
   "id": "CF",
   "label": "Cloud Run functions",
   "svc": "取込関数",
   "floor": "F1",
   "x": -5.625,
   "y": -5.0,
   "kind": "ingest",
   "desc": "SFTPのファイルを取得してGCSへ置く。"
  },
  {
   "id": "SCH",
   "label": "Cloud Scheduler",
   "svc": "起動",
   "floor": "F1",
   "x": -5.625,
   "y": -9.375,
   "kind": "ctrl",
   "desc": "取込関数を定時に起動。"
  },
  {
   "id": "DF1",
   "label": "Dataflow",
   "svc": "ストリーミング整形",
   "floor": "F2",
   "x": -6.25,
   "y": 4.375,
   "kind": "process",
   "desc": "イベントを整形し、BigQueryとBigtableへ書き込む。"
  },
  {
   "id": "DLQ",
   "label": "dead-letter",
   "svc": "Pub/Sub",
   "floor": "F2",
   "x": -1.25,
   "y": 8.75,
   "kind": "error",
   "desc": "整形できなかったエラー行の退避先。"
  },
  {
   "id": "GCS2",
   "label": "GCS: error",
   "svc": "Cloud Storage",
   "floor": "F2",
   "x": 3.125,
   "y": 8.75,
   "kind": "error",
   "desc": "エラー行の保管。"
  },
  {
   "id": "GCS1",
   "label": "GCS: landing",
   "svc": "Cloud Storage",
   "floor": "F2",
   "x": -7.5,
   "y": -4.375,
   "kind": "storage",
   "desc": "バッチデータの着地点。"
  },
  {
   "id": "DPROC",
   "label": "Dataproc",
   "svc": "大規模変換",
   "floor": "F2",
   "x": -1.875,
   "y": -5.625,
   "kind": "process",
   "desc": "Sparkによる大規模変換。"
  },
  {
   "id": "BT",
   "label": "Bigtable",
   "svc": "在庫リアルタイム",
   "floor": "F3",
   "x": -2.5,
   "y": 6.25,
   "kind": "storage",
   "desc": "店舗在庫をミリ秒で引けるように保持。"
  },
  {
   "id": "BQRAW",
   "label": "BigQuery raw",
   "svc": "生データ",
   "floor": "F3",
   "x": -1.25,
   "y": 0.0,
   "kind": "bq1",
   "desc": "取り込んだままの生データ。リアルタイムとバッチがここで合流。"
  },
  {
   "id": "DFORM",
   "label": "Dataform",
   "svc": "変換SQL",
   "floor": "F3",
   "x": 3.125,
   "y": -2.5,
   "kind": "process",
   "desc": "raw→staging→martの変換SQLを管理。"
  },
  {
   "id": "BQSTG",
   "label": "BigQuery staging",
   "svc": "整形済み",
   "floor": "F3",
   "x": 5.625,
   "y": 0.0,
   "kind": "bq2",
   "desc": "型・重複・名寄せを整えた層。"
  },
  {
   "id": "BQMART",
   "label": "BigQuery mart",
   "svc": "分析用",
   "floor": "F3",
   "x": 11.25,
   "y": 0.0,
   "kind": "bq3",
   "desc": "業務で使う集計済みテーブル。予測結果もここに戻る。"
  },
  {
   "id": "LOOK",
   "label": "Looker",
   "svc": "BI",
   "floor": "F4",
   "x": 8.75,
   "y": -6.25,
   "kind": "serve",
   "desc": "経営・店舗向けダッシュボード。"
  },
  {
   "id": "VAI",
   "label": "Vertex AI",
   "svc": "需要予測",
   "floor": "F4",
   "x": 13.75,
   "y": -1.875,
   "kind": "serve",
   "desc": "martのデータで需要予測モデルを学習・推論。"
  },
  {
   "id": "EP",
   "label": "Vertex AI Endpoint",
   "svc": "オンライン推論",
   "floor": "F4",
   "x": 13.75,
   "y": 5.0,
   "kind": "serve",
   "desc": "発注APIから呼ばれる推論エンドポイント。"
  },
  {
   "id": "RUN",
   "label": "発注API",
   "svc": "Cloud Run",
   "floor": "F4",
   "x": 6.25,
   "y": 6.875,
   "kind": "serve",
   "desc": "在庫と予測から自動発注。発注イベントはPub/Subへ戻る。"
  },
  {
   "id": "AH",
   "label": "Analytics Hub",
   "svc": "取引先共有",
   "floor": "F4",
   "x": 18.125,
   "y": -5.0,
   "kind": "serve",
   "desc": "取引先へデータを共有。"
  },
  {
   "id": "RE",
   "label": "Reverse ETL",
   "svc": "CRM連携",
   "floor": "F4",
   "x": 18.125,
   "y": 0.625,
   "kind": "serve",
   "desc": "martのデータをCRMへ書き戻す。"
  },
  {
   "id": "COMP",
   "label": "Cloud Composer",
   "svc": "指揮塔",
   "floor": "SKY",
   "x": -15.625,
   "y": -1.875,
   "z": 23.0,
   "kind": "ctrl",
   "desc": "バッチ処理全体のオーケストレーション。上空から各処理に指示を出す。"
  },
  {
   "id": "MON",
   "label": "Monitoring / Logging",
   "svc": "監視",
   "floor": "SKY",
   "x": -15.625,
   "y": 6.25,
   "z": 23.0,
   "kind": "mon",
   "desc": "Dataflow・Composer・発注APIを監視。"
  },
  {
   "id": "DPLEX",
   "label": "Dataplex",
   "svc": "カタログ/品質",
   "floor": "SKY",
   "x": 3.75,
   "y": -10.0,
   "z": 16.0,
   "kind": "gov",
   "desc": "蓄積フロアとlandingを常時スキャンして品質を監視。"
  }
 ],
 "edges": [
  {
   "from": "POS",
   "to": "PS1",
   "type": "rt"
  },
  {
   "from": "EC",
   "to": "PS2",
   "type": "rt"
  },
  {
   "from": "APP",
   "to": "FB",
   "type": "rt"
  },
  {
   "from": "FB",
   "to": "BQRAW",
   "type": "rt"
  },
  {
   "from": "PS1",
   "to": "DF1",
   "type": "rt"
  },
  {
   "from": "PS2",
   "to": "DF1",
   "type": "rt"
  },
  {
   "from": "DF1",
   "to": "BQRAW",
   "type": "rt"
  },
  {
   "from": "DF1",
   "to": "BT",
   "type": "rt"
  },
  {
   "from": "BT",
   "to": "RUN",
   "type": "rt"
  },
  {
   "from": "EP",
   "to": "RUN",
   "type": "rt"
  },
  {
   "from": "VAI",
   "to": "EP",
   "type": "rt"
  },
  {
   "from": "DF1",
   "to": "DLQ",
   "type": "err",
   "label": "エラー行"
  },
  {
   "from": "DLQ",
   "to": "GCS2",
   "type": "err"
  },
  {
   "from": "ONP",
   "to": "DS",
   "type": "batch",
   "label": "Interconnect"
  },
  {
   "from": "DS",
   "to": "GCS1",
   "type": "batch"
  },
  {
   "from": "SFTP",
   "to": "CF",
   "type": "batch"
  },
  {
   "from": "CF",
   "to": "GCS1",
   "type": "batch"
  },
  {
   "from": "GCS1",
   "to": "DPROC",
   "type": "batch"
  },
  {
   "from": "GCS1",
   "to": "BQRAW",
   "type": "batch"
  },
  {
   "from": "DPROC",
   "to": "BQRAW",
   "type": "batch"
  },
  {
   "from": "BQRAW",
   "to": "DFORM",
   "type": "batch"
  },
  {
   "from": "DFORM",
   "to": "BQSTG",
   "type": "batch"
  },
  {
   "from": "BQSTG",
   "to": "BQMART",
   "type": "batch"
  },
  {
   "from": "BQMART",
   "to": "LOOK",
   "type": "batch"
  },
  {
   "from": "BQMART",
   "to": "VAI",
   "type": "batch"
  },
  {
   "from": "BQMART",
   "to": "AH",
   "type": "batch"
  },
  {
   "from": "BQMART",
   "to": "RE",
   "type": "batch"
  },
  {
   "from": "VAI",
   "to": "BQMART",
   "type": "loop",
   "label": "予測結果",
   "turns": 1.0,
   "radius": 1.6
  },
  {
   "from": "RUN",
   "to": "PS1",
   "type": "loop",
   "label": "発注イベント",
   "turns": 1.5,
   "radius": 2.2
  },
  {
   "from": "COMP",
   "to": "DPROC",
   "type": "ctrl"
  },
  {
   "from": "COMP",
   "to": "DFORM",
   "type": "ctrl"
  },
  {
   "from": "COMP",
   "to": "DS",
   "type": "ctrl"
  },
  {
   "from": "SCH",
   "to": "CF",
   "type": "ctrl"
  },
  {
   "from": "MON",
   "to": "DF1",
   "type": "mon"
  },
  {
   "from": "MON",
   "to": "COMP",
   "type": "mon"
  },
  {
   "from": "MON",
   "to": "RUN",
   "type": "mon"
  },
  {
   "from": "DPLEX",
   "to": "BQRAW",
   "type": "gov"
  },
  {
   "from": "DPLEX",
   "to": "BQSTG",
   "type": "gov"
  },
  {
   "from": "DPLEX",
   "to": "BQMART",
   "type": "gov"
  },
  {
   "from": "DPLEX",
   "to": "GCS1",
   "type": "gov"
  }
 ],
 "flowStyles": {
  "rt": {
   "name": "リアルタイム",
   "color": "#3BA7FF",
   "period": 40,
   "count": 5,
   "clump": 1
  },
  "batch": {
   "name": "バッチ（日次）",
   "color": "#FF9A3B",
   "period": 120,
   "count": 1,
   "clump": 4
  },
  "loop": {
   "name": "戻りループ",
   "color": "#FF4FD8",
   "period": 80,
   "count": 3,
   "clump": 1
  },
  "err": {
   "name": "エラー退避",
   "color": "#FF4B4B",
   "period": 120,
   "count": 1,
   "clump": 1
  },
  "ctrl": {
   "name": "制御（Composer等）",
   "color": "#A08BFF",
   "period": 60,
   "count": 1,
   "clump": 1
  },
  "mon": {
   "name": "監視",
   "color": "#5EE7C8",
   "period": 120,
   "count": 1,
   "clump": 1
  },
  "gov": {
   "name": "ガバナンス（Dataplex）",
   "color": "#7CFF8A",
   "period": 120,
   "count": 1,
   "clump": 1
  }
 },
 "kindColors": {
  "source": "#8A93A6",
  "ingest": "#2E6FD8",
  "process": "#3A4FCB",
  "storage": "#2B8C9E",
  "bq1": "#3D6EA8",
  "bq2": "#3F86D6",
  "bq3": "#4FB0FF",
  "serve": "#2FA37A",
  "error": "#C2384A",
  "ctrl": "#6E58D8",
  "mon": "#2FA58F",
  "gov": "#3FAE4F"
 },
 "security": {
  "label": "VPC Service Controls / IAM / CMEK 境界",
  "min": [
   -13.125,
   -11.25,
   2.8
  ],
  "max": [
   20.625,
   11.25,
   25.5
  ]
 }
}