System Design

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?

  1. User đổi tên Ann → Zoe, lệnh ghi vào primary, commit xong trả “saved”.
  2. 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).
  3. 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ìnhTă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ánPhức tạp hơn khi triển khai
Cập nhật UI lạc quan từ dữ liệu vừa gửiPhả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.