Data contract là thoả thuận kiểm tra được bằng máy giữa bên sinh dữ liệu (thường là team backend sở hữu DB hoặc event) và bên dùng dữ liệu: schema gồm cột nào, kiểu gì, ràng buộc gì, ai chịu trách nhiệm, và thay đổi thế nào thì phải báo trước.
Vấn đề nó giải quyết: backend đổi amount thành total_amount, hoặc đổi price từ số sang chuỗi, rồi deploy lúc 17h. Pipeline đêm đó fail — hoặc tệ hơn, không fail mà nạp NULL, sáng hôm sau dashboard doanh thu về 0. Team data là bên phát hiện sau cùng, dù không đổi gì.
Một contract thường gồm:
- Schema: tên cột, kiểu dữ liệu, nullable, giá trị cho phép.
- Ngữ nghĩa: amount tính bằng VND, đã gồm VAT hay chưa.
- SLA: dữ liệu có trước mấy giờ, trễ tối đa bao lâu.
- Owner và quy trình thay đổi: breaking change thì tạo version mới và chạy song song một thời gian.
Thực thi ở đâu — contract chỉ có giá trị khi được kiểm tra tự động:
- Phía producer: CI chặn PR đổi schema phá contract; với event thì đặt compatibility mode trên Schema Registry.
- Phía consumer: kiểm tra schema lúc ingest, sai thì dừng và báo đúng owner.
- Trong warehouse: dbt model contract buộc model trả đúng tên cột và kiểu dữ liệu, sai thì không build.
models:
- name: dim_customers
config:
contract:
enforced: true
columns:
- name: customer_id
data_type: int
constraints:
- type: not_nullKhác data test: contract giữ hình dạng dữ liệu và được kiểm tra lúc build; data test kiểm tra nội dung sau khi build (trùng, null, giá trị lạ). Hai thứ bổ sung cho nhau.
Lưu ý: phần khó của data contract là thống nhất giữa các team, không phải công cụ. Tài liệu schema trên wiki mà không có bước kiểm tra tự động sẽ lỗi thời sau vài sprint.