Ý chính: Broker chỉ giữ thứ tự trong một phạm vi nhất định. Nghiệp vụ phải xác định những sự kiện nào thật sự cần đi cùng thứ tự.
Thuật ngữ trong bài: Ordering: thứ tự sự kiện; deduplication: loại sự kiện trùng; replay: phát lại sự kiện cũ để dựng lại dữ liệu.
Bài toán thực tế
Giữ thứ tự toàn hệ thống làm giảm khả năng xử lý song song. Thử lại tạo sự kiện trùng, còn sự kiện đến muộn có thể ghi đè dữ liệu mới. Phát lại lịch sử cũng có thể gửi lại email hoặc thanh toán nếu không tách tác động bên ngoài.
Broker chỉ đảm bảo thứ tự trong một phạm vi như partition hoặc khóa định tuyến. Nghiệp vụ phải xác định rõ đối tượng nào cần thứ tự, thay vì yêu cầu một thứ tự toàn cục làm mất khả năng xử lý song song.
Sự kiện trùng và đến muộn là điều bình thường trong cơ chế giao nhận ít nhất một lần. Consumer cần lưu phiên bản, chống trùng và tách tác động bên ngoài khỏi quá trình phát lại.
Thiết kế và triển khai
- Chọn khóa partition trùng với phạm vi nghiệp vụ cần giữ thứ tự.
- Gắn mã sự kiện, mã đối tượng, phiên bản đối tượng và thời điểm xảy ra vào mỗi sự kiện.
- Tách việc dựng lại trạng thái khỏi email, thanh toán và các tác động bên ngoài khi phát lại.
Mã minh họa: Consumer kiểm tra phiên bản sự kiện
if inbox.contains(event.id): ACK
current = projection.version(event.aggregateId)
if event.version <= current: ACK
if event.version > current + 1: park(event)
transaction(apply(event), inbox.add(event.id))
ACKSự kiện tạo ra khoảng trống phiên bản cần được cách ly, cảnh báo và xử lý theo chính sách; chờ vô hạn cũng là một dạng mất dữ liệu.
Rủi ro cần tính trước
- Producer đặt lại phiên bản đối tượng sau một đợt chuyển đổi dữ liệu.
- Phát lại lịch sử vô tình gửi lại thông báo cho khách hàng.
- Một đối tượng có quá nhiều sự kiện làm bão hòa partition chứa nó.
Nên theo dõi gì?
| Tín hiệu | Điều tín hiệu cho biết |
|---|---|
| Tỷ lệ khoảng trống phiên bản và sự kiện đến muộn | Làm lộ lỗi thứ tự hoặc lỗi quản lý phiên bản ở producer. |
| Tỷ lệ sự kiện bị loại do trùng | Cho biết mức độ thử lại và tính ổn định của cơ chế giao nhận. |
| Thông lượng phát lại và số tác động bên ngoài bị chặn | Theo dõi đồng thời tiến độ lẫn độ an toàn của quá trình phục hồi. |
Đưa vào production từng bước
Thêm mã sự kiện, phiên bản đối tượng và số liệu quan sát trước khi bắt buộc quy tắc mới. Áp dụng inbox chống trùng cho một consumer, tạo môi trường chỉ dành cho phát lại và diễn tập toàn bộ lịch sử trước khi dùng công cụ trong sự cố thật.
Điều cần nhớ
Tính đúng của luồng sự kiện đến từ phạm vi thứ tự rõ và consumer có kết quả xác định, không chỉ từ cam kết của broker.
