SOS, đây không phải là trung tâm kiểm soát và phòng ngừa dịch bệnh đâu nhé các bạn. Mình đang nói là ở ngữ cảnh về công nghệ á. Dành cho những bạn nào chưa biết về nó thì CDC chính là Change Data Capture.
Tại sao lại có khái niệm này? Trước hết chúng ta sẽ làm rõ nhu cầu từ thực tế: Bạn đang có một hệ thống website bán hàng với kiến trúc khá là phổ biến: Web App + Database. Một ngày đẹp trời, bạn có nhận thêm các nhu cầu khác cần đồng bộ và xử lý dữ liệu bán hàng trên các hệ thống khác (phân tích, tìm kiếm, báo cáo, …). Công việc của bạn là phải cập nhật toàn bộ những data đang có trên DB hiện tại sang các hệ thống khác, và từ các hệ thống đó các bên khác nhau sẽ xử lý data theo cách của họ mà không ảnh hưởng gì đến hệ thống bán hàng mà bạn đang chạy.
Đề bài đã đưa ra, anh em sẽ giải như thế nào nhỉ? Theo cách “Think fast” thì thông thường chúng ta sẽ nghĩ ngay đến việc snapshot hay dump toàn bộ dữ liệu trên DB của chúng ta sang hệ thống khác, và mình có thể setup đều đặn sau 1 ngày hoặc 1 tiếng chẳng hạn, lại thực hiện lại thao tác trên. Nghe đến đây có vẻ “make sense” nhỉ, vấn đề đã được giải quyết? Tất nhiên là chưa rồi 😀 Vấn đề nó phát sinh ở chính việc, sau một khoảng thời gian, bạn lại cần phải dump các dữ liệu mới cập nhật hoặc thay đổi để đẩy sang các hệ thống. Vậy câu hỏi đặt ra là: Trong khoảng thời gian đó (1 tiếng chẳng hạn) các hệ thống khác sẽ có được dữ liệu mới nhất để xử lý hay không?
Rõ ràng chúng ta thấy, đây là một solution đưa ra rất nhanh, tuy nhiên thực thi nó thì có khá là nhiều lỗ hổng, chưa kể việc chúng ta xác định những dữ liệu nào đã thay đổi để snapshot cũng không hề đơn giản. Và rồi, xuất phát từ vấn đề chân phương đó, khái niệm CDC như một sự cứu rỗi giúp chúng ta có thứ mà search trên Google 😀 Hiểu một cách đơn giản về CDC thì đó là cách thức nhân bản dữ liệu từ một nguồn sang các nguồn dữ liệu khác, đảm bảo tất cả những thay đổi xảy ra phải được đồng bộ một cách realtime.
Và điều kiện để CDC work thì chúng ta cần phải “extract” 2 thứ sau từ dữ liệu nguồn:
1. “Consistent Snapshot”: Lấy toàn bộ dữ liệu nguồn tại một thời điểm và ghi vào các hệ thống dữ liệu khác
2. “Real-time stream of changes”: Tất cả những thay đổi (thêm, sửa, xoá) từ thời điểm snapshot ở trên trở về sau sẽ được đồng bộ một cách nhất quán theo thời gian thực đến hệ thống khác, đảm bảo rằng mỗi khi dữ liệu nguồn có sự thay đổi thì những hệ thống khác cũng nhận được sự thay đỏi đó
Về cách để Implement một hệ thống có CDC thì có rất nhiều cách bạn có thể tham khảo trên Google. Bạn có thể dùng tool của một bên thứ 3 như là "debezium" hay có thể tự triển khai theo cách của bạn sử dụng Binlog trong DB và kết hợp với Kafka để streaming.
Trong khuôn khổ bài chia sẻ, Huy đơn giản chỉ muốn chia sẻ với các bạn khái niệm cơ bản về CDC cũng như tại sao chúng ta cần phải áp dụng nó. Hi vọng qua chia sẻ này sẽ có thêm các keyword để bạn có thể học và áp dụng các cách triển khai cho hệ thống mà các bạn đang phụ trách nhé. Nếu bạn có thêm những kinh nghiệm khi triển khai hệ thống có CDC thì cùng chia sẻ với Huy và mọi người nhé.
Xin chào, mình là Huy Đê Tê!
Tham khảo: Make sense of stream processing