Vấn đề đặc thù của hệ bất đồng bộ: producer và consumer deploy độc lập, và Kafka còn giữ message cũ trong retention nên consumer mới vẫn phải đọc được dữ liệu ghi bằng schema cũ.
Hai chiều tương thích:
- Backward compatible — consumer dùng schema mới đọc được dữ liệu ghi bằng schema cũ. Đạt được khi bạn chỉ thêm field có giá trị mặc định hoặc xoá field optional. Đây là mặc định của Schema Registry, vì nó cho phép nâng consumer trước rồi tua lại đọc toàn bộ topic.
- Forward compatible — consumer dùng schema cũ đọc được dữ liệu ghi bằng schema mới; consumer bỏ qua field lạ. Đạt được khi bạn thêm field optional hoặc xoá field có default. Hữu ích khi producer buộc phải lên trước.
- Full là thoả cả hai; các biến thể TRANSITIVE kiểm tra với mọi phiên bản trước chứ không chỉ phiên bản gần nhất.
Thay đổi phá vỡ tương thích: đổi tên field, đổi kiểu (int → string), thêm field bắt buộc không default, xoá field bắt buộc.
Quy trình rollout an toàn:
1. Thêm field mới ở dạng optional/có default — không bao giờ sửa tại chỗ.
2. Deploy consumer trước, để nó biết đọc field mới nhưng vẫn chịu được khi field vắng mặt.
3. Deploy producer bắt đầu ghi field mới.
4. Sau khi retention của dữ liệu cũ trôi qua và không còn consumer nào dùng field cũ, mới đánh dấu deprecated rồi xoá ở một release sau.
Muốn đổi kiểu hoặc đổi tên thì làm bằng cách thêm field mới song song, chuyển dần consumer, rồi bỏ field cũ — không sửa trực tiếp. Bắt buộc tương thích ở tầng registry để CI chặn schema hỏng trước khi lên production.