Bỏ qua để đến nội dung
Knowledge Hub

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.
Ghép cặp

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ỏ field

4Đổ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.