Bấm lưu rồi mà vẫn thấy dữ liệu cũ? Replication lag và read-your-writes
Tóm tắt
Lệnh ghi vào primary trả OK ngay, nhưng thay đổi được đồng bộ sang replica bất đồng bộ nên có độ trễ. Nếu app đọc từ replica quá sớm, người dùng thấy dữ liệu cũ. Read-your-writes giải quyết bằng cách đưa các lần đọc ngay sau khi ghi của chính user đó về primary.
Chuyện gì đã xảy ra?
- User đổi tên Ann → Zoe, lệnh ghi vào primary, commit xong trả “saved”.
- Thay đổi được gửi sang replica bất đồng bộ, mất khoảng 1200ms mới áp xong (độ trễ dao động theo tải).
- Trang tải lại, lệnh đọc đi vào replica khi nó mới đồng bộ được 480ms → trả về Ann.
Dữ liệu không hề mất: primary đã giữ “Zoe” từ lúc commit.
Giải pháp: read-your-writes
| Cách làm | Ưu điểm | Đánh đổi |
|---|---|---|
| Sau khi ghi, đọc của chính user đó đi thẳng primary trong một khoảng ngắn (vd. 1,5 giây) | Đơn giản, user luôn thấy thay đổi của mình | Tăng tải nhẹ cho primary |
| Ghi lại vị trí log (LSN/GTID) sau khi ghi; chỉ đọc replica đã bắt kịp vị trí đó | Chính xác, không phụ thuộc thời gian đoán | Phức tạp hơn khi triển khai |
| Cập nhật UI lạc quan từ dữ liệu vừa gửi | Phản hồi tức thì | Phải xử lý trường hợp ghi thất bại |
Áp dụng thế nào?
- Dev: Đo replication lag thực tế (p95/p99) để chọn cửa sổ đọc primary hợp lý, đừng đoán.
- PM / QA: Lỗi kiểu “lưu rồi mà không thấy” thường không phải mất dữ liệu — kiểm tra kiến trúc đọc/ghi trước khi kết luận.