議程7 - pgcapture - CDC framework for PostgreSQL in Go - Kenny Chen / Benjamin Tsai

tags: GopherDay2024 Agenda

Loading embed note

Slido 連結

[投影片連結]

github.com/replicase/pgcapture

key question:feeds 更新即時性/一致性

功能:追蹤的最新文章列表,要夠即時

  • 想法:create post 時直接要求 subscribed list 服務更新
    • 加一個 message broker 變成 async 處理
  • 問題:如果有 create post 但打到 message borker 時壞掉,就沒辦法偵測出來,會有資料一致性問題
    • 解法:透過 CDC 來知道所有的 DB 資料變更
  • 其他場景
    • 文章標題或 tag 有改變時,通知對應的使用者
    • Analysis 需求:先建 disk snapshot 產生 offline DB replica 讓其他團隊使用 -> 也可以透過 CDC 同步過去

PGCapture

PG -> pg2pulsar -> Apache Pulsar (Message broker) -> send change events to Gateway -> gRPC to Consumer

  • 要建立另一個 DB: 用 pulsar2pg

Debouncing

可能會針對同一個 type 收到很多 change event e.g. 有一篇文章收到很多讚,將 bouncing 的 event group 成一筆,再送給 Consumers。

Gateway

  • 用 pulsar client 註冊新的 change event
  • Controlled dump: DBLog 會進來要 dump 資料的請求
    • Dumper 傳到 Agent 的資料會包含這次任務的 table, page start/end

pg2pulsar & pulsar2pg

  • Logical Replication
    • logical decoding
      原理為:透過 tx 過程產生的 write-ahead log 在最後 commit 時才寫進 disk 的機制
  • LSN: 代表 write ahead log 裡的位置

pgcapture

  • 預設使用 pgoutput: binary 資料比較小
  • 有 DDL query 時,會自動 insert 一個 ddl log,就會主動通知到 pulsar 一個 insert event
  • 拿資料的方式:一個 transaction 內所有 message 先全部拿到,再往下。LSN 一樣代表同一個 tx
  • PulsarSink 會知道上次已經送出的 checkpoint,從那個點開始往下繼續送給 consumer
  • 如果有 DDL + DML mixed statement -> 忽略後面的 DML
Select a repo