Skip to content

ADR-0003. Thực thi SLA qua cron monitor lặp lại + escalation worker

TrườngGiá trị
StatusAccepted
Ngày2026-04-10
Người quyết địnhsupport-team
Thay thế

Bối cảnh

  • Mỗi ticket có hai deadline (first-response, resolution) tính từ SlaPolicy củ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:

  1. QueueComponent.scheduleSlaMonitoring() đăng ký một job lặp lại trên hàng đợi helpdesk.sla-monitor với pattern: WORKER_CONFIG.SLA_MONITOR_INTERVAL (mỗi phút) và một jobId: '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.
  2. sla-monitor.worker (concurrency 1) chạy RunSlaMonitorUseCase, quét hàng SlaTracker theo batch (SLA_BATCH_SIZE = 100) tìm warning/breach so với SLA_WARNING_THRESHOLDS (75/90/100/150).
  3. 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ởi escalation.workerProcessEscalationUseCase.
  4. Kiểm tra thủ công khả thi qua QueueComponent.triggerSlaCheck({ ticketId }) ở priority HIGH.

Hệ quả

ƯuNhượ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 restartChi 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 retryMonitor 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êuWorker 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 assignTicketUseCase bị 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ọnVì sao bị từ chối
Job delayed theo từng ticket ở mỗi ngưỡngBù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 endpointThê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.ts
  • src/application/use-cases/sla-policy/run-sla-monitor.use-case.ts, process-escalation.use-case.ts
  • src/shared/common/constants/common.constant.ts (WORKER_CONFIG, SLA_WARNING_THRESHOLDS, ESCALATION_TIMING)

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.