Ghép cặp: thay đổi schema event này là backward, forward, full hay phá vỡ? Trung cấp
Thời gian đọc ước tính: 1 phút
Bốn service consume OrderPlaced và deploy theo lịch riêng, nên mỗi thay đổi schema đều gặp reader và writer ở các version khác nhau. Kéo kết luận vào từng thay đổi.
- Mỗi giải thích chỉ ra bên nào hỏng: consumer mới đọc record cũ hay consumer cũ đọc record mới.
- Kết luận cho Avro theo luật Schema Resolution trong Avro spec và đã chạy lại bằng
avsc; case Protobuf theo proto3 guide.
Thay đổi schema này tương thích kiểu gì?
Topic orders.order-placed chứa OrderPlaced v1 (Avro nếu không ghi khác). Bốn consumer (billing, inventory, email, analytics) deploy độc lập. Kéo kết luận vào từng thay đổi.
Mẹo: hỏi hai câu. Reader mới đọc được record cũ không? (backward) Reader cũ đọc được record mới không? (forward) Cả hai có = full, cả hai không = phá vỡ.
Chạm Chọn đáp án ở từng tình huống. Trên máy tính có thể kéo thẻ bên dưới thả vào tình huống.
Đã giải 0/8 · sai 0 lần
1Thêm field currency có default.
{ "name": "currency", "type": "string", "default": "VND" }2Thêm field currency không có default.
{ "name": "currency", "type": "string" }3Bỏ field tuỳ chọn couponCode, field mà v1 khai báo có default.
// v1
{ "name": "couponCode", "type": ["null", "string"], "default": null }
// v2: đã bỏ field4Đổi tên amount thành totalAmount, không có alias.
// v1
{ "name": "amount", "type": "long" }
// v2
{ "name": "totalAmount", "type": "long" }5Mở rộng amount từ int sang long vì đơn lớn bị tràn số.
// v1
{ "name": "amount", "type": "int" }
// v2
{ "name": "amount", "type": "long" }6Thu hẹp amount từ long xuống int để tiết kiệm dung lượng.
// v1
{ "name": "amount", "type": "long" }
// v2
{ "name": "amount", "type": "int" }7Protobuf: field string coupon_code = 7 đã bị xoá quý trước. Một field mới dùng lại number 7.
message OrderPlaced {
string order_id = 1;
int64 discount = 7; // trước đây: string coupon_code = 7
}8Thêm symbol REFUNDED vào enum status. Enum ở v1 không có default.
// v1
{ "type": "enum", "name": "Status", "symbols": ["PLACED", "PAID"] }
// v2
{ "type": "enum", "name": "Status", "symbols": ["PLACED", "PAID", "REFUNDED"] }Thứ tự deploy, các mode của Schema Registry và cách đưa một thay đổi phá vỡ lên production: đọc tiến hoá schema của event.