ADR-0003. Thực thi SLA qua cron monitor lặp lại + escalation worker
| Trường | Giá trị |
|---|---|
| Status | Accepted |
| Ngày | 2026-04-10 |
| Người quyết định | support-team |
| Thay thế | — |
Bối cảnh
- Mỗi ticket có hai deadline (first-response, resolution) tính từ
SlaPolicycủa nó. Dịch vụ phải phát hiện deadline sắp tới (warning), vi phạm, và vi phạm critical, rồi thông báo và escalate. - Phát hiện deadline về bản chất là thời-gian-driven: không có gì trong đường request báo hệ thống "ticket này vừa vượt 75% SLA của nó." Các tùy chọn là job delayed theo từng ticket được lên lịch ở mỗi ngưỡng, hoặc một lượt quét định kỳ.
- Escalation (Level 1→2→3) phải đáng tin và retry được, với priority critical hơn công việc thường lệ.
Quyết định
Dùng một job cron BullMQ lặp lại cộng một escalation worker chuyên dụng:
QueueComponent.scheduleSlaMonitoring()đăng ký một job lặp lại trên hàng đợihelpdesk.sla-monitorvớipattern: WORKER_CONFIG.SLA_MONITOR_INTERVAL(mỗi phút) và mộtjobId: 'sla-monitor-cron'cố định để bản trùng không tích lũy. Khi boot nó gỡ các bản lặp lại cũ trước.sla-monitor.worker(concurrency 1) chạyRunSlaMonitorUseCase, quét hàngSlaTrackertheo batch (SLA_BATCH_SIZE = 100) tìm warning/breach so vớiSLA_WARNING_THRESHOLDS(75/90/100/150).- Vi phạm enqueue job notification và job escalation trên
helpdesk.escalation(concurrency 5, priority 1, 3 retry với backoff lũy thừa), tiêu thụ bởiescalation.worker→ProcessEscalationUseCase. - Kiểm tra thủ công khả thi qua
QueueComponent.triggerSlaCheck({ ticketId })ở priority HIGH.
Hệ quả
| Ưu | Nhược |
|---|---|
| Một lượt cron xử lý tất cả ticket — không lan man lịch theo từng ticket | Độ trễ phát hiện lên đến ~1 phút (khoảng cron) |
Một jobId cố định duy nhất ngăn bản lặp lại trùng qua các lần restart | Chi phí lượt quét scale theo lượng ticket mở (giảm thiểu bằng batch) |
| Escalation cô lập trên hàng đợi priority cao riêng với retry | Monitor concurrency-1 là trần throughput cho tenant rất lớn |
| Đường trigger thủ công cho kiểm tra lại có mục tiêu | Worker process phải đang chạy, hoặc thực thi SLA ngừng âm thầm |
Lưu ý: tái phân công senior-agent Level-2+ hiện bị tắt trong code (cuộc gọi
assignTicketUseCasebị comment out) — escalation worker chỉ gửi thông báo. Xem Vận hành → Vấn đề đã biết.
Phương án đã cân nhắc
| Tùy chọn | Vì sao bị từ chối |
|---|---|
| Job delayed theo từng ticket ở mỗi ngưỡng | Bùng nổ job được lên lịch; lộn xộn khi lên lịch lại lúc đổi policy/priority |
| Cron ngoài / k8s CronJob gọi một endpoint | Thêm gắn kết infra; bản lặp lại BullMQ giữ lịch trong-app và quan sát được |
| DB trigger / pg_cron | Đẩy business logic vào database; khó kiểm thử và quan sát |
Tham khảo
src/components/queue.component.ts(scheduleSlaMonitoring,triggerSlaCheck)src/components/workers/sla-monitor.worker.ts,escalation.worker.tssrc/application/use-cases/sla-policy/run-sla-monitor.use-case.ts,process-escalation.use-case.tssrc/shared/common/constants/common.constant.ts(WORKER_CONFIG,SLA_WARNING_THRESHOLDS,ESCALATION_TIMING)