Đi đến nội dung chính
VI
Trang chủ / Bài viết / Giảm tải cơ sở dữ liệu khi lưu tiến độ học
12 thg 2, 2026 · Z-SOFT Admin · 10 phút đọc

Giảm tải cơ sở dữ liệu khi lưu tiến độ học

Gom các cập nhật tiến độ thường xuyên rồi ghi theo lô để giảm tải cơ sở dữ liệu mà không làm mất trạng thái người học.

Xem tất cả bài viết

Ý 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

  1. Chỉ phản hồi thành công sau khi tiến độ đã được hợp nhất an toàn vào Redis.
  2. 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.
  3. 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ớiCho 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 ghiPhả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õ.

HỢP TÁC CÙNG Z-SOFT

Mỗi quyết định công nghệ hôm nay đều ảnh hưởng đến nhiều năm sau.

Trao đổi với đội ngũ Z-SOFT để đánh giá hiện trạng, xác định mục tiêu và lựa chọn kiến trúc phù hợp với định hướng phát triển của doanh nghiệp.

Đặt lịch tư vấn