Cả hai đều lấy phần thay đổi thay vì copy lại cả bảng mỗi lần. Khác nhau ở chỗ lấy thay đổi từ đâu.
Query-based (polling) — định kỳ chạy một query như sau:
SELECT * FROM orders
WHERE updated_at > :last_watermark
AND updated_at <= :current_run_ts;- Dễ làm, chỉ cần quyền đọc và cột
updated_atcó index. - Không thấy DELETE: dòng đã xoá thì không còn để query, trừ khi ứng dụng dùng soft delete.
- Mất thay đổi trung gian: một dòng đổi 3 lần giữa hai lần quét chỉ thấy trạng thái cuối.
- Phụ thuộc việc ứng dụng cập nhật
updated_atđúng ở mọi chỗ, kể cả script sửa tay. Mỗi lần quét lại cộng thêm tải lên DB nguồn.
Log-based — đọc transaction log của DB (MySQL binlog, PostgreSQL WAL qua logical replication) bằng công cụ như Debezium, đẩy từng sự kiện insert/update/delete vào Kafka:
- Bắt đủ mọi thay đổi, có cả DELETE và giá trị trước/sau khi đổi.
- Độ trễ cỡ giây, tải lên DB nguồn nhỏ, không cần thêm cột vào schema.
- Đổi lại: cần quyền replication, cấu hình DB (binlog_format=ROW, wal_level=logical), vận hành thêm Kafka Connect và xử lý schema change trên luồng sự kiện.
Chọn: bảng nhỏ hoặc dữ liệu tham chiếu, cập nhật theo ngày → query-based hoặc full load là đủ. Bảng giao dịch lớn, cần bắt DELETE, cần độ trễ phút hoặc giây → log-based.
Lưu ý: với PostgreSQL, replication slot của CDC giữ WAL cho tới khi consumer đọc xong. Connector dừng vài ngày mà không ai để ý thì WAL phình đầy ổ đĩa của DB production, nên luôn cần cảnh báo độ trễ của slot.