🎯 什麼情境該想到我

當你「有一個本身不使用訊息的應用程式或資料源,卻想把它接上訊息系統」的時候,而且最好不必大改那個系統。

⚙️ 怎麼用(步驟 / 公式)

意圖:用一個配接器把不使用訊息的應用(或其資料庫、API)連上訊息通道,在兩者間雙向搬運資料。

做法 / 結構要點:

  • 配接器以該系統原本的方式存取它(呼叫其 API、讀寫其資料庫、監看其事件)。
  • 一端與應用溝通、一端與訊息通道溝通,把應用資料轉成訊息送出、或把訊息轉成對應用的操作。
  • 讓既有系統幾乎不必修改,就能參與訊息式整合。

★ 今天最常見的三種通道配接器

類型實例一句話
① ★ CDC(資料庫 → 訊息)Debezium、AWS DMS、Kafka Connect讀 WAL/binlog,把資料變更變成事件
② API ↔ 訊息API Gateway → SQS、Webhook → 佇列、Kafka Connect HTTP sink讓不會講訊息的系統參與
③ 檔案 ↔ 訊息S3 Event → SQS、Kafka Connect S3 sink見 檔案傳輸

★ 配接器的價值:讓「不能改的系統」也能參與訊息架構。
遺留系統、第三方 SaaS、只會寫資料庫的舊應用——你在它外面接一個配接器,不動它一行程式碼。

★★ CDC 是這個模式今天最重要的形態

應用程式 ──寫──▶ PostgreSQL ──WAL──▶ Debezium ──▶ Kafka ──▶ 下游服務
                             ↑ ★ 應用程式完全不知道這條管線存在

為什麼 CDC 特別有價值:

  1. ★ 零侵入:不改應用程式、不需要它發訊息。
  2. ★ 不會漏:WAL 是交易日誌,只要交易 commit 了就一定在裡面——
    這順便解決了雙寫問題(見 保證投遞、工具-預寫日誌與崩潰復原)。
  3. ★ 是拆分單體的遷移路徑:下游從「直接讀表」改成「訂閱事件」,每一步可回退
    (見 共享資料庫)。

★★ 但 CDC 有一個根本的設計問題:它洩漏資料庫 schema。

CDC 事件 = 「orders 表的第 42 列,status 從 'pending' 變成 'paid'」
業務事件 = 「訂單 #42 已付款」
                    ↑ ★ 這兩者不一樣

★★ CDC 給你的是「資料變更」,不是「業務事件」。
直接把 CDC 事件發給下游 → 下游依賴你的表結構,你改欄位名就破壞它們(見 內幕交易)。
兩種解法:

  • ★ 配一個轉換層(Kafka Streams/一個服務)把資料變更轉成業務事件(訊息轉換器/防腐層)。
  • ★ 或改用 Outbox:應用程式明確寫出業務事件到 outbox 表,CDC 只讀那張表
    → 這是目前公認最好的組合(見 工具-Transactional-Outbox-Pattern)。

★ 配接器的三個實務陷阱

① ★★ 初始快照(initial snapshot)
   CDC 上線時要先讀一次全表 → 幾千萬列灌進 Kafka
   → ★ 會壓垮下游,也可能壓垮來源 DB
   → 要規劃:分批快照、限流、或先讓下游準備好

② ★ WAL 保留與 replication slot
   Postgres 的 logical replication slot 如果消費者停了,★ WAL 會一直累積不能回收
   → ★★ 磁碟滿了資料庫就會停止寫入。這是 CDC 最嚴重的營運風險
   → 一定要監控 slot 的 lag 與 WAL 大小

③ ★ 配接器是單點
   Debezium 掛了 → 事件流停了,但應用程式完全正常(★ 沒有任何錯誤會出現)
   → ★ 要監控「最後一筆事件的時間」,不要只監控配接器的存活

★ 兄弟辨析

差別
訊息橋接★ 連接兩個訊息系統(Kafka ↔ RabbitMQ);配接器連接「非訊息系統 ↔ 訊息系統」
訊息閘道★ 在應用程式內部封裝 broker API;配接器在應用程式外面
服務啟動器讓同一個服務同時能被訊息與同步呼叫觸發(★ 在應用程式內)
正規化器多種格式轉成一種(配接器可能用到它)

🧪 我實際套用的紀錄

  • (待填)

⚠️ 注意 / 什麼時候不適用

  • 配接器通常需為特定系統客製,且可能綁定其內部細節(如資料庫結構),耦合較深。

  • 直接讀寫他人資料庫的配接方式可能繞過該應用的商業邏輯,需謹慎。

  • ★★ CDC 給你的是「資料變更」不是「業務事件」。直接發給下游 = 下游依賴你的表結構。配轉換層,或改用 Outbox + CDC。

  • ★★ Postgres 的 logical replication slot 停了會讓 WAL 無限累積,磁碟滿了資料庫就停止寫入。 這是 CDC 最嚴重的營運風險,必須監控 slot lag。

  • ★ CDC 的初始快照會灌爆下游(也可能壓垮來源 DB)。要規劃分批與限流。

  • ★ 配接器掛了不會有任何錯誤出現——應用程式完全正常,只是事件流停了。要監控「最後一筆事件的時間」。

  • ★ CDC 看不到「意圖」:status 從 pending 變 paid,是付款成功還是人工修資料?業務語義只有應用程式知道。

  • 配接器是額外的部署與監控負擔。能改應用程式直接發訊息時,不一定需要它。

  • DELETE 在 CDC 裡特別麻煩:有些設定只給主鍵、拿不到舊值(Postgres 要設 REPLICA IDENTITY FULL,代價是 WAL 變大)。

🔗 相關工具