Bỏ qua, đến nội dung

Câu hỏi thường gặp (FAQ) — Async Task Manager

Sử dụng

Task bị treo ở trạng thái "running" quá lâu?

Task có thể bị treo do nhiều nguyên nhân. Xử lý theo thứ tự:

  1. Đợi timeout: Mặc định 10 phút — task sẽ tự động chuyển sang failed
  2. Huỷ thủ công: Nhấn nút Cancel trong giao diện task list
  3. Kiểm tra log: Xem log server để xác định nguyên nhân (lỗi database, disk full, memory...)
  4. Restart server: Trường hợp cuối cùng — task sẽ chuyển sang failed sau restart

TIP

Nếu task thường xuyên bị treo, có thể do:

  • Dữ liệu quá lớn → tăng task timeout
  • Database chậm → tối ưu query, thêm index
  • Disk full → dọn dẹp dung lượng

File kết quả tự động xoá sau 24 giờ (mặc định). Giải pháp:

  • Tải file ngay sau khi task hoàn tất
  • Nếu cần giữ lâu hơn, điều chỉnh cấu hình Cleanup after
  • Chạy lại task nếu file đã bị xoá

Có thể chạy nhiều task cùng lúc không?

Có. Mặc định tối đa 5 tasks đồng thời. Tasks vượt giới hạn sẽ xếp hàng chờ ở trạng thái pending.

Số tasksHành vi
≤ 5Chạy ngay
> 5Xếp hàng chờ (FIFO)
Sau khi task hoàn tấtTask tiếp theo trong hàng đợi được chạy

Tăng giới hạn nếu server đủ tài nguyên (CPU, memory, disk I/O).

Làm sao biết task nào đang chạy?

  • Giao diện: Nhấn biểu tượng task indicator trên toolbar → danh sách tasks hiện ra
  • API: Gọi asyncTasks:list với filter { status: 'running' }
  • Database: Truy vấn bảng asyncTasks — nhưng nên dùng API thay vì query trực tiếp

Lỗi thường gặp

Task export thất bại với dữ liệu lớn?

Nguyên nhânGiải pháp
Task timeout (10 phút mặc định)Tăng cấu hình timeout
Disk fullKiểm tra dung lượng disk, xoá file cũ
Memory không đủChia nhỏ dữ liệu (export theo phần/filter)
Database query chậmThêm index cho collection, tối ưu filter

WARNING

Export dữ liệu lớn (> 100,000 bản ghi) nên:

  • Chạy ngoài giờ cao điểm
  • Sử dụng filter để chia nhỏ
  • Đảm bảo disk có ít nhất 2x dung lượng file kết quả dự kiến

Task bị mất sau khi restart server?

  • Tasks đang chạy trong memory sẽ bị mất khi server restart
  • Tasks đã lưu vào database (status pending) vẫn còn nhưng không tự chạy lại
  • Giải pháp: Sử dụng Redis làm task queue — đảm bảo bền vững giữa các lần restart
# Cấu hình Redis cho task queue
REDIS_URL=redis://localhost:6379

Progress bar không cập nhật?

Có ba nguyên nhân phổ biến:

  1. Task không hỗ trợ báo cáo tiến trình: Một số task chỉ báo 0% → 100% — không có cập nhật giữa chừng
  2. Polling interval: Client poll mỗi vài giây — có thể có độ trễ hiển thị
  3. SSE connection: Nếu dùng Server-Sent Events, kiểm tra connection không bị proxy/firewall chặn

Nhiều user cùng tạo task, có xung đột không?

Không. Mỗi task chạy độc lập. Tuy nhiên:

  • Nhiều task export cùng lúc sẽ tốn tài nguyên (CPU, disk I/O)
  • Giới hạn concurrent tasks áp dụng toàn server (không per-user)
  • Nếu nhiều user cùng export dữ liệu lớn, cân nhắc tăng timeout và giảm concurrent limit

Dành cho Developer

Plugin tôi viết muốn dùng async task, bắt đầu từ đâu?

  1. Đảm bảo plugin-async-task-manager là dependency
  2. Trong method load(), đăng ký task type (xem Tham chiếu API)
  3. Implement handler function với updateProgress() để báo tiến trình
  4. (Tuỳ chọn) Đăng ký UI component cho task type qua TaskOriginRegistry ở client

Retry logic hoạt động thế nào?

  • Retry mặc định 3 lần cho transient errors (network timeout, temporary DB lock)
  • Persistent errors (lỗi logic, data invalid) không retry
  • Giữa các lần retry có delay tăng dần (exponential backoff)