Ý chính: Không nên tạo một giao dịch cơ sở dữ liệu cho mỗi tín hiệu tiến độ mà trình phát video gửi lên.
Thuật ngữ trong bài: Write-behind: gom thay đổi rồi ghi xuống cơ sở dữ liệu theo lô; checkpoint: mốc dữ liệu đã lưu an toàn; idempotent: xử lý lặp lại vẫn cho cùng kết quả.
Bài toán thực tế
Một trình phát có thể gửi tiến độ sau mỗi 15 giây. Với hàng nghìn người học, số lần ghi nhỏ này tạo áp lực lớn lên khóa, chỉ mục và cơ chế sao chép dữ liệu. Giá trị nghiệp vụ lại không tăng tương ứng.
Tiến độ học là dữ liệu có tần suất cập nhật cao nhưng giá trị nằm ở trạng thái tổng hợp, không nằm ở từng lần ghi riêng lẻ. Điều đó cho phép hệ thống gom nhiều cập nhật trước khi ghi bền vững, miễn là quy tắc hợp nhất không làm tiến độ đi lùi.
Khó khăn thật sự không phải giảm số câu lệnh ghi, mà là xử lý đúng khi người học dùng nhiều thiết bị, mạng chập chờn hoặc worker dừng giữa chừng.
Thiết kế và triển khai
- Chỉ phản hồi thành công sau khi tiến độ đã được hợp nhất an toàn vào Redis.
- Dùng quy tắc hợp nhất có kết quả xác định để yêu cầu gửi lại không làm tiến độ đi lùi.
- Ghi xuống cơ sở dữ liệu theo lô định kỳ và chỉ thử lại những bản ghi thất bại.
Mã minh họa: Hợp nhất theo phiên bản và ghi mốc tiến độ bền vững
incoming = { userId, lessonId, position, completed, seq }
state = redis.HGET(progressKey)
if incoming.seq <= state.seq then return state end
next.position = incoming.position
next.completed = state.completed OR incoming.completed
next.seq = incoming.seq
redis.HSET(progressKey, next)
redis.ZADD(dirtyKey, now(), progressKey)
DB UPSERT ... WHERE stored_seq < next.seqĐiểm số trong tập chờ ghi nên là thời điểm thay đổi đầu tiên chưa được lưu, nhờ đó worker ưu tiên đúng dữ liệu đã chờ lâu.
Rủi ro cần tính trước
- Redis nhận cập nhật nhưng khởi động lại trước khi dữ liệu được ghi bền vững.
- Một bản ghi lỗi liên tục vì vi phạm lược đồ hoặc khóa ngoại và chặn cả lô.
- Hai thiết bị dùng bộ đếm không cùng phạm vi nên trạng thái không thể so sánh trực tiếp.
Nên theo dõi gì?
| Tín hiệu | Điều tín hiệu cho biết |
|---|---|
| Tuổi của cập nhật chưa được ghi lâu nhất | Đo độ trễ lưu bền vững tệ nhất mà người học đang gặp. |
| Số người học chờ ghi và tốc độ cập nhật mới | Cho biết worker có theo kịp tải và cần thêm bao nhiêu năng lực. |
| Số xung đột và lần thử lại khi ghi | Phản ánh cập nhật đồng thời hoặc điều kiện phiên bản chưa đúng. |
| Độ bền Redis và độ trễ sao chép | Định lượng khoảng tiến độ có nguy cơ mất khi hạ tầng gặp sự cố. |
Đưa vào production từng bước
Trong giai đoạn đầu, giữ luồng ghi hiện tại làm chuẩn và cho write-behind chạy song song. So sánh mốc tiến độ theo bài học, phiên ứng dụng và thiết bị; chỉ chuyển hoàn toàn khi các sai lệch đã được giải thích và kiểm thử phục hồi đã đạt.
Điều cần nhớ
Write-behind chỉ đáng dùng khi quy tắc hợp nhất dữ liệu có kết quả xác định, tiến độ không thể đi lùi và độ trễ ghi xuống đã được đo rõ.
