[DE Blog #55] Hạ Tầng Ingestion Thời Gian Thực Siêu Quy Mô: Chuyên Sâu Kafka Connect, Debezium CDC Internals, Quản Trị Schema Registry & Dead Letter Queue (DLQ)
![[DE Blog #55] Hạ Tầng Ingestion Thời Gian Thực Siêu Quy Mô: Chuyên Sâu Kafka Connect, Debezium CDC Internals, Quản Trị Schema Registry & Dead Letter Queue (DLQ)](/uploads/ai-images/cover-kafka-connect-debezium-cdc.png)
1. Bối cảnh thực tế (Context & Problem Statement)
Trong một tập đoàn công nghệ lớn, hạ tầng dữ liệu phải liên tục thu thập dữ liệu biến động từ hàng nghìn cơ sở dữ liệu nguồn (PostgreSQL, MySQL, Oracle, SQL Server) để nạp vào Data Lakehouse (Apache Iceberg, Snowflake) theo thời gian thực:
- Tốc độ phát sinh giao dịch lên tới hàng trăm nghìn bản ghi mỗi giây ().
- Các bảng dữ liệu nghiệp vụ có dung lượng khổng lồ lên tới hàng chục Terabytes.
Nếu đội ngũ Data tự viết các script Python/Go đơn lẻ để đọc dữ liệu và đẩy vào Kafka:
- Làm sập Database vận hành: Việc chạy các câu lệnh quét bảng định kỳ chiếm dụng toàn bộ CPU và khóa bảng (Table Locks), làm tê liệt ứng dụng của khách hàng.
- "Cơn ác mộng" thay đổi cấu trúc bảng (Schema Drift): Đội Backend tự ý thêm cột mới, đổi tên cột hoặc đổi kiểu dữ liệu mà không thông báo Toàn bộ pipeline hạ nguồn (Downstream Consumers) bị sập hàng loạt lúc nửa đêm.
- Hiện tượng "Tin nhắn độc" (Poison Pill): Một bản ghi bị lỗi định dạng (Corrupted Record) lọt vào Kafka Topic khiến consumer liên tục bị crash khi giải mã, làm tắc nghẽn toàn bộ dòng chảy dữ liệu.
Kafka Connect kết hợp Debezium CDC và Schema Registry là "bộ ba tiêu chuẩn vàng" của ngành công nghiệp dữ liệu toàn cầu nhằm giải quyết trọn vẹn bài toán Nạp dữ liệu thời gian thực không gián đoạn, tự động co giãn và an toàn tuyệt đối.
2. Các Khái Niệm & Cơ Chế Cốt Lõi
2.1. Kiến Trúc Phân Tán Của Kafka Connect (Connect Distributed Mode)
Kafka Connect là một framework mã nguồn mở có khả năng mở rộng ngang (Scale-out) chuyên biệt cho việc tích hợp dữ liệu:
- Connect Cluster & Workers: Một cụm máy chủ gồm nhiều tiến trình Java (Workers). Chúng tự động điều phối và cân bằng tải với nhau thông qua chính các Topic nội bộ của Kafka (
connect-configs,connect-offsets,connect-status). - Connectors vs. Tasks (Đơn vị tính toán song song):
- Connector: Định nghĩa cấu hình logic: Dữ liệu lấy từ đâu (Source), ghi vào đâu (Sink), định dạng gì.
- Tasks: Là các luồng thực thi thực tế. Một Connector có thể chia công việc thành Tasks chạy song song trên nhiều Worker machines khác nhau để tăng tốc độ nạp dữ liệu.
- Giao thức Tái cân bằng Tăng dần Hợp tác (Incremental Cooperative Rebalancing):
- Trước đây (Eager Rebalance): Mỗi khi có một worker mới gia nhập cụm, toàn bộ mọi Task đang chạy trên tất cả các máy chủ đều bị dừng lại hoàn toàn (Stop-the-world) để chia lại việc.
- Hiện nay (Cooperative): Chỉ có những Task thực sự cần di chuyển mới bị tạm dừng; toàn bộ các Task khác vẫn tiếp tục xử lý dữ liệu bình thường mà không hề bị gián đoạn (Zero Downtime).
[SOURCE DB: PostgreSQL] [KAFKA CONNECT CLUSTER] [KAFKA BROKERS]
[Table: orders] ===(WAL)===> [Worker 1: Task 1 (Orders)] ========> [Topic: db.orders]
[Table: users] ===(WAL)===> [Worker 2: Task 2 (Users)] ========> [Topic: db.users]
[Table: payments] ===(WAL)===> [Worker 3: Task 3 (Payments)] ========> [Topic: db.payments]
(Tự động điều phối qua Group Coordinator)
2.2. Cơ Chế Nội Bộ Của Debezium Log-Based CDC
Debezium không bao giờ chạy các câu truy vấn SELECT * định kỳ. Thay vào đó, nó đóng vai trò như một Bản sao nhận dữ liệu (Replication Slave / Client) kết nối thẳng vào tầng lưu trữ nhật ký giao dịch cấp thấp:
- PostgreSQL: Sử dụng Logical Decoding Plugins (chuẩn
pgoutput) để đọc trực tiếp file Write-Ahead Log (WAL). - MySQL: Đọc trực tiếp các sự kiện nhị phân Binary Log (Binlog -
ROWformat).
Đột Phá Kỹ Thuật: Chụp Ảnh Không Khóa Bảng (Non-Locking Incremental Snapshotting)
Làm thế nào để nạp dữ liệu ban đầu cho một bảng đang có hàng nghìn giao dịch ghi mỗi giây mà không cần khóa bảng?
- Cơ chế Watermark của Debezium (DBA không cần can thiệp):
- Debezium chia bảng thành hàng nghìn khối nhỏ (Chunks, ví dụ mỗi khối dòng dựa trên khóa chính
id). - Trước khi đọc Chunk , Debezium ghi một bản ghi dấu mốc đặc biệt vào bảng nội bộ trên Database nguồn (Low Watermark).
- Debezium chạy lệnh đọc dữ liệu của Chunk (
SELECT * FROM table WHERE id BETWEEN 10000 AND 20000). - Sau khi đọc xong Chunk, Debezium ghi tiếp một bản ghi dấu mốc kết thúc (High Watermark).
- Trong suốt quá trình này, các luồng giao dịch của khách hàng vẫn ghi vào WAL bình thường. Khi Debezium đọc file log WAL, nó sẽ đối chiếu và tự động hợp nhất (Reconciliation): Nếu có bản ghi trong Chunk bị cập nhật trong khoảng giữa Low và High Watermark, giá trị mới nhất từ WAL sẽ luôn chiến thắng!
- Nạp trọn vẹn bảng mà hoàn toàn không gây khóa đĩa (Zero-Locking) và không làm gián đoạn hệ thống Production!
- Debezium chia bảng thành hàng nghìn khối nhỏ (Chunks, ví dụ mỗi khối dòng dựa trên khóa chính
2.3. Quản Trị Schema Registry & Confluent Wire Format
Nếu gửi dữ liệu streaming qua Kafka ở dạng chuỗi JSON thô:
- Mỗi bản ghi đều phải đính kèm toàn bộ tên cột:
{"order_id": "123", "customer_id": "888", "amount": 500.0, "status": "COMPLETED"}Chi phí mạng và dung lượng lưu trữ bị lãng phí tới chỉ để lưu tên các trường lặp đi lặp lại! - Không có cơ chế kiểm tra tính đúng đắn của kiểu dữ liệu.
Giải pháp Schema Registry kết hợp Apache Avro / Protobuf:
- Schema của bảng được đăng ký tập trung một lần duy nhất trên Schema Registry và được gán một mã số nguyên định danh duy nhất (Schema ID: 4 bytes).
- Cấu trúc Confluent Wire Format (Chỉ tốn thêm đúng 5 bytes mở đầu):
- Khi Consumer đọc dữ liệu: Nó chỉ cần bóc đầu tiên để biết Schema ID, tra cứu Schema từ bộ nhớ đệm (Cache) và giải mã dữ liệu nhị phân tức thì Tiết kiệm băng thông mạng và dung lượng đĩa của cụm Kafka!
CONFLUENT WIRE FORMAT (Tiết kiệm băng thông tối đa):
[ 1 Byte Magic (0x00) ] [ 4 Bytes Schema ID (e.g. 104) ] [ Pure Binary Avro Payload (No Field Names!) ]
2.4. Các Chế Độ Tương Thích Cấu Trúc Bảng (Schema Compatibility Rules)
Khi ứng dụng cần cập nhật cấu trúc dữ liệu (thêm cột, sửa kiểu dữ liệu), Schema Registry bắt buộc phải được cấu hình một trong các chế độ kiểm soát:
- BACKWARD Compatibility (Mặc định & An toàn nhất):
- Người dùng nâng cấp Consumer trước, nâng cấp Producer sau.
- Consumer sử dụng Schema mới (v2) vẫn có thể đọc được dữ liệu cũ (v1) được gửi từ Producer.
- Quy tắc: Chỉ được phép Thêm cột có giá trị mặc định (
DEFAULT) hoặc Xóa một cột không bắt buộc.
- FORWARD Compatibility:
- Người dùng nâng cấp Producer trước, nâng cấp Consumer sau.
- Consumer đang dùng Schema cũ (v1) vẫn có thể đọc được dữ liệu mới (v2) do Producer phát ra.
- Quy tắc: Chỉ được phép Thêm cột không bắt buộc hoặc Xóa cột có giá trị mặc định.
- FULL Compatibility:
- Kết hợp cả BACKWARD và FORWARD Đảm bảo nâng cấp theo bất kỳ thứ tự nào cũng không bao giờ làm sập hệ thống.
- NONE: Tắt kiểm tra (Cực kỳ nguy hiểm, không bao giờ dùng trên Production).
2.5. Hóa Giải Tin Nhắn Độc Bằng Dead Letter Queue (DLQ)
- Hiện tượng Poison Pill: Một bản ghi bị lỗi bộ nhớ, sai định dạng serialize hoặc vi phạm schema lọt vào Topic. Khi Sink Connector (ví dụ nạp vào Iceberg/Snowflake) cố gắng đọc bản ghi này, nó bị ném ngoại lệ (
SerializationException). - Nếu không xử lý, Connector sẽ tự động dừng (State: FAILED) Toàn bộ pipeline bị tê liệt hoàn toàn!
- Cơ chế hoạt động của Dead Letter Queue:
- Cấu hình
errors.tolerance = all. - Khi gặp bản ghi lỗi, Connector không bị dừng lại.
- Bản ghi lỗi được tự động bóc tách, gắn thêm metadata nguyên nhân lỗi (Tên ngoại lệ, Stacktrace, Timestamp) và chuyển hướng đẩy vào một Topic cách ly riêng biệt:
topic-name-dlq. - Pipeline chính tiếp tục xử lý các bản ghi bình thường phía sau một cách mượt mà. Đội ngũ Data Platform nhận cảnh báo và xử lý bản ghi trong DLQ sau.
- Cấu hình
3. Các Bảng Markdown So Sánh Chi Tiết
📊 Bảng 1: So Sánh Toàn Diện Các Chế Độ Tương Thích Schema (Schema Compatibility)
| Chế độ tương thích | Định nghĩa quy tắc | Thứ tự triển khai bắt buộc | Thay đổi được phép | Thay đổi BỊ CẤM |
|---|---|---|---|---|
| BACKWARD (Mặc định) | Schema mới (v2) đọc được dữ liệu của Schema cũ (v1) | Nâng cấp Consumer trước Producer sau | Thêm cột mới có giá trị default; Xóa cột tùy chọn | Thêm cột bắt buộc (required); Đổi tên cột |
| FORWARD | Schema cũ (v1) đọc được dữ liệu của Schema mới (v2) | Nâng cấp Producer trước Consumer sau | Xóa cột có default; Thêm cột tùy chọn | Xóa cột bắt buộc; Đổi tên cột |
| FULL | Thỏa mãn đồng thời cả BACKWARD và FORWARD | Tự do nâng cấp Producer hay Consumer trước đều an toàn | Thêm/Xóa các cột bắt buộc phải có giá trị default | Bất kỳ thay đổi nào làm mất khả năng tương thích 2 chiều |
| BACKWARD_TRANSITIVE | Schema mới đọc được dữ liệu của TẤT CẢ các phiên bản cũ trước đó (v1, v2, v3...) | Nâng cấp Consumer trước | Tương tự BACKWARD nhưng kiểm tra trên toàn bộ lịch sử | Bất kỳ thay đổi nào phá vỡ một phiên bản cũ trong quá khứ |
📊 Bảng 2: So Sánh Log-Based CDC (Debezium) vs. Query Polling vs. Database Triggers
| Tiêu chí kỹ thuật | Log-Based CDC (Debezium) | Query-Based Polling (WHERE updated_at > ...) | Database Triggers (Bảng Audit Log) |
|---|---|---|---|
| Tác động lên DB nguồn | Gần như bằng 0 (Chỉ đọc file log tuần tự) | Rất cao (Chiếm CPU/IO khi quét bảng định kỳ) | Rất cao (Làm tăng gấp đôi thời gian ghi của App) |
Khả năng bắt lệnh DELETE | Bắt được 100% (Ghi nhận rõ thao tác xóa) | Thất bại hoàn toàn (Không thể biết dòng nào bị xóa) | Bắt được |
| Bắt các thay đổi trung gian | Bắt được mọi trạng thái thay đổi giữa các chu kỳ | Bị mất dữ liệu nếu 1 dòng bị update nhiều lần giữa 2 lần quét | Bắt được |
| Độ trễ truyền tải | Cực thấp (Vài mili-giây đến vài giây) | Cao (Phụ thuộc vào chu kỳ quét: 1 phút - 1 giờ) | Rất thấp |
| Yêu cầu phân quyền | Cần quyền đọc replication log (Replication role) | Chỉ cần quyền SELECT cơ bản | Cần quyền tạo Trigger và tạo Bảng nội bộ |
📊 Bảng 3: So Sánh Các Định Dạng Serialization Trong Data Streaming
| Định dạng | Cần Schema Registry? | Kích thước Payload | Tốc độ Serialize/Deserialize | Khả năng đọc hiểu bởi con người |
|---|---|---|---|---|
| JSON Thô (Plain) | Không cần | Rất lớn (Chứa toàn bộ tên trường text) | Chậm (Cần parse chuỗi ký tự) | Rất trực quan (Human-readable) |
| Apache Avro | Bắt buộc (Confluent Wire Format) | Cực kỳ nhỏ gọn (Pure Binary) | Siêu tốc (Nhờ biên dịch cấu trúc) | Không (Dạng nhị phân, cần schema để decode) |
| Protocol Buffers (Protobuf) | Tùy chọn (Nhúng tag số nguyên) | Cực kỳ nhỏ gọn | Siêu tốc | Không |
| Apache Parquet | Không cần | Rất nhỏ (Có nén cột) | Chậm hơn khi ghi từng bản ghi lẻ | Không (Chuyên sâu cho lưu trữ theo lô trên đĩa) |
4. Best Practices & Kỹ Thuật Vận Hành Thực Chiến (Pro-Tips)
💡 Cấu hình Chống Tràn Ổ Đĩa Do WAL Slot Lag Trong PostgreSQL
- Nguy cơ tiềm ẩn: Khi Debezium kết nối với Postgres qua Replication Slot, PostgreSQL sẽ giữ lại toàn bộ các file WAL trên đĩa và không bao giờ xóa cho đến khi Debezium xác nhận đã đọc xong. Nếu Debezium bị dừng hoặc nghẽn mạng trong 2 ngày, ổ cứng của máy chủ PostgreSQL sẽ bị đầy và làm sập toàn bộ Database sản phẩm!
- Giải pháp bảo vệ kép:
- Cấu hình trần giới hạn kích thước giữ lại WAL trên PostgreSQL:
-- Giới hạn tối đa slot chỉ được giữ 50GB WAL, vượt quá sẽ tự động ngắt để bảo vệ DB: ALTER SYSTEM SET max_slot_wal_keep_size = '50GB'; - Bật tính năng Heartbeat Action trong cấu hình Debezium để định kỳ gửi tín hiệu xác nhận đọc ngay cả khi bảng nguồn không có giao dịch mới:
"heartbeat.interval.ms": "5000", "heartbeat.action.query": "INSERT INTO debezium_heartbeat (status) VALUES ('ALIVE');"
- Cấu hình trần giới hạn kích thước giữ lại WAL trên PostgreSQL:
💡 Cấu hình Chuẩn Mực Dead Letter Queue (DLQ) Cho Kafka Connect
{
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"tasks.max": "1",
"errors.tolerance": "all",
"errors.deadletterqueue.topic.name": "dlq_debezium_errors",
"errors.deadletterqueue.topic.replication.factor": 3,
"errors.deadletterqueue.context.headers.enable": true,
"errors.retry.delay.ms": "5000",
"errors.retry.timeout": "300000"
}
5. Góc Ôn Luyện Phỏng Vấn (Interview Corner)
❓ Câu hỏi 1: Debezium thực hiện chụp ảnh dữ liệu ban đầu (Initial Snapshot) trên một bảng dữ liệu 10TB đang có hàng chục nghìn giao dịch ghi mỗi giây như thế nào mà không cần khóa bảng (Non-locking Incremental Snapshotting)?
- Gợi ý trả lời:
- Hạn chế của cơ chế chụp ảnh cũ (Blocking Snapshot): Trước đây, để nạp dữ liệu ban đầu, hệ thống buộc phải khóa bảng (
LOCK TABLE IN SHARE MODE) để ngăn chặn việc ghi dữ liệu trong lúc đọc, gây ngừng trệ toàn bộ ứng dụng của doanh nghiệp. - Thuật toán Incremental Snapshotting không khóa bảng (Watermarking Mechanism):
- Chia nhỏ không gian khóa chính (Chunking): Debezium chia bảng 10TB thành hàng nghìn khối nhỏ dựa trên Primary Key (ví dụ mỗi khối bản ghi: ).
- Đánh dấu điểm mốc (Watermark Insertion): Trước khi quét Chunk 1, Debezium mở một transaction nhanh chèn một bản ghi tín hiệu vào một bảng nhỏ nội bộ: . Sau đó, nó thực hiện câu lệnh
SELECT * FROM table WHERE ID BETWEEN 1 AND 10000(ở mức đọc không khóa). Đọc xong, nó chèn tiếp . - Hợp nhất dữ liệu động với Streaming Log (Dynamic Reconciliation):
- Trong lúc đọc Chunk 1, các giao dịch thực tế của người dùng vẫn liên tục ghi vào WAL.
- Debezium lưu tạm kết quả của Chunk 1 vào bộ nhớ đệm. Khi luồng đọc WAL quét qua các sự kiện nằm giữa và : Nếu một bản ghi trong Chunk 1 có cập nhật trong WAL, giá trị từ WAL sẽ ghi đè lên giá trị đọc được từ câu lệnh SELECT.
- Các bản ghi sau khi hợp nhất mới chính thức được phát vào Kafka Topic.
- Kết quả: Dữ liệu ban đầu được nạp dần dần từng khối song song với luồng streaming thời gian thực mà không cần giữ bất kỳ khóa bảng nào, bảo vệ ứng dụng nguồn hoạt động 100% bình thường.
- Hạn chế của cơ chế chụp ảnh cũ (Blocking Snapshot): Trước đây, để nạp dữ liệu ban đầu, hệ thống buộc phải khóa bảng (
❓ Câu hỏi 2: Giải thích cơ chế hoạt động của Schema Registry và định dạng Confluent Wire Format. Tại sao việc gửi thông điệp Avro kèm Schema Registry lại giúp tiết kiệm tới 90% băng thông mạng và dung lượng đĩa so với việc gửi chuỗi JSON thô qua Kafka?
- Gợi ý trả lời:
- Vấn đề của JSON thô:
- JSON là định dạng có kèm mô tả ngữ nghĩa (Self-describing format). Trong mỗi thông điệp gửi qua mạng, toàn bộ tên các trường (
"transaction_id","customer_account_number","timestamp") đều phải được lặp lại dưới dạng chuỗi ký tự ASCII. - Trong một hệ thống xử lý 1 tỷ sự kiện/ngày, hàng chục Gigabytes băng thông mạng bị lãng phí chỉ để truyền đi truyền lại các chuỗi ký tự tên cột giống hệt nhau.
- JSON là định dạng có kèm mô tả ngữ nghĩa (Self-describing format). Trong mỗi thông điệp gửi qua mạng, toàn bộ tên các trường (
- Đột phá của Confluent Wire Format kết hợp Schema Registry:
- Khi Producer gửi dữ liệu lần đầu, nó gửi Schema đầy đủ lên Schema Registry để đăng ký. Schema Registry lưu trữ schema này và cấp phát một mã số nguyên định danh duy nhất (ví dụ:
Schema ID = 42). - Định dạng gói tin gửi vào Kafka Broker (Chỉ tốn đúng 5 bytes mở đầu):
- Byte 0:
Magic Byte (0x00)quy định chuẩn Confluent. - Bytes 1–4:
Schema ID(Số nguyên 4-bytes Big-Endian đại diện cho ID 42). - Phần còn lại: Dữ liệu thực tế được nén nhị phân theo chuẩn Apache Avro Binary Encoding, hoàn toàn không chứa dù chỉ một ký tự tên cột nào!
- Byte 0:
- Phía Consumer giải mã: Consumer đọc 4 bytes đầu tiên để lấy Schema ID, tra cứu trong Local Cache của nó (nếu chưa có thì gọi API lên Schema Registry lấy về một lần duy nhất) để lấy Schema chuẩn và giải mã dòng nhị phân.
- Tiết kiệm tới dung lượng: Kích thước một bản ghi giảm từ (JSON) xuống chỉ còn (Avro nhị phân), giúp tiết kiệm hàng triệu USD chi phí hạ tầng mạng và lưu trữ đĩa cứng cho doanh nghiệp lớn.
- Khi Producer gửi dữ liệu lần đầu, nó gửi Schema đầy đủ lên Schema Registry để đăng ký. Schema Registry lưu trữ schema này và cấp phát một mã số nguyên định danh duy nhất (ví dụ:
- Vấn đề của JSON thô:
❓ Câu hỏi 3: Khi một Producer vô tình phát ra một thông điệp lỗi (Poison Pill) làm sập Sink Connector, bạn sẽ thiết kế kiến trúc phục hồi lỗi tự động và Dead Letter Queue (DLQ) như thế nào để pipeline không bị tắc nghẽn?
- Gợi ý trả lời theo 4 thành phần kiến trúc:
- Tách biệt lỗi tạm thời (Transient Errors) và lỗi dữ liệu chết (Poison Pills):
- Lỗi tạm thời (Mạng chập chờn, DB đích bị quá tải tạm thời): Cấu hình cơ chế tự động thử lại có giãn cách thời gian (
errors.retry.timeout = 300000ms,errors.retry.delay.ms = 5000ms) để tự phục hồi khi hạ tầng ổn định trở lại.
- Lỗi tạm thời (Mạng chập chờn, DB đích bị quá tải tạm thời): Cấu hình cơ chế tự động thử lại có giãn cách thời gian (
- Kích hoạt Dead Letter Queue cho lỗi vĩnh viễn (Poison Pills):
- Cấu hình
errors.tolerance = allđể ngăn chặn việc Task bị dừng đột ngột (State: FAILED). - Khi gặp thông điệp không thể deserialize hoặc vi phạm ràng buộc schema, hệ thống tự động đóng gói bản ghi lỗi này cùng với Header ngữ cảnh lỗi (Tên lỗi gốc, Stacktrace, Tên topic nguồn, Offset, Partition) và phát vào một Topic riêng biệt:
connect-dlq-topic.
- Cấu hình
- Giám sát & Cảnh báo thời gian thực (Alerting on DLQ):
- Thiết lập cảnh báo Prometheus/Datadog theo dõi chỉ số
kafka_connect_sink_task_deadletterqueue_produce_requests: Nếu số lượng bản ghi trong DLQ tăng bất thường () Bắn cảnh báo tức thì qua PagerDuty cho đội ngũ Data On-call.
- Thiết lập cảnh báo Prometheus/Datadog theo dõi chỉ số
- Quy trình tái xử lý (Replay & Reprocessing Pipeline):
- Xây dựng một ứng dụng xử lý phụ trợ (DLQ Consumer): Đọc các bản ghi lỗi từ DLQ, cho phép kỹ sư kiểm tra nguyên nhân, sửa đổi dữ liệu lỗi (Data Patching) và đẩy ngược lại vào luồng xử lý chính mà không làm gián đoạn hệ thống.
- Tách biệt lỗi tạm thời (Transient Errors) và lỗi dữ liệu chết (Poison Pills):
6. Tóm Tắt Ghi Nhớ Nhanh (Key Takeaways)
- Kafka Connect là chuẩn mực mở rộng ngang cho Ingestion; sử dụng giao thức Incremental Cooperative Rebalancing để thêm/bớt task mà không gây gián đoạn hệ thống.
- Debezium Log-Based CDC khai thác trực tiếp WAL/Binlog; công nghệ Incremental Snapshotting qua Watermark cho phép nạp bảng mà không cần khóa bảng.
- Confluent Wire Format kết hợp Schema Registry chỉ tốn thêm đúng mở đầu, giúp tiết kiệm băng thông mạng so với JSON thô.
- BACKWARD Compatibility là quy tắc tương thích an toàn nhất: Nâng cấp Consumer trước Producer sau; chỉ thêm cột có giá trị
default. - Luôn cấu hình Dead Letter Queue (DLQ) để tự động cô lập các tin nhắn độc (Poison Pills), bảo vệ pipeline hoạt động liên tục 24/7.