CYBERSOFT
Đăng nhập

Thực chiến: định tuyến & phân công tài xế thời gian thực, SLA giao hàng trong logistics

Thực chiến doanh nghiệpLogisticsAPIk6/PerfThực tế
🗓 1 tháng trước22 phút đọc·👁 1,557 lượt xem👤 103 người đọc

Bài sâu 14 chương: bối cảnh điều phối tài xế thời gian thực, kiến trúc 5 dịch vụ (routing/assignment/WebSocket/SLA clock), tính duy nhất của assignment & đồng hồ SLA làm oracle, test plan, ma trận ca, code automation happy path & ca lỗi (double-assignment, mất kết nối, double-ACK), đo SLA realtime, CI/CD & tải k6, AI Agent, phỏng vấn.

1. Bối cảnh doanh nghiệp & phạm vi

Một nền tảng giao hàng chặng cuối tại Việt Nam vận hành đội xe gồm 18.000 tài xế hoạt động đồng thời trong giờ cao điểm, xử lý trung bình 60.000 đơn/giờ trên toàn quốc. Khác với bài toán đối soát COD offline, bài toán ở đây là thời gian thực (realtime): mỗi khi một đơn mới phát sinh, hệ thống điều phối (dispatch) phải chọn đúng 1 tài xế phù hợp trong vòng vài giây, đẩy thông báo qua kênh WebSocket tới thiết bị tài xế, và chờ tài xế xác nhận (ACK) trong cửa sổ thời gian ngắn trước khi coi như từ chối và tìm tài xế khác. SLA cam kết với khách hàng là 'gán tài xế trong 30 giây kể từ khi đơn được xác nhận thanh toán' và 'giao hàng trong 45 phút nội thành' — hai chỉ số SLA hoàn toàn khác nhau về bản chất đo lường nhưng cùng phụ thuộc vào chất lượng của engine định tuyến.

Kiến trúc điều phối realtime · Realtime dispatch & routing architecture Order Intake Routing Engine Assignment Svc WebSocket Gateway Driver App (realtime) SLA Clock Svc Load Balancer (zone) Bất biến: mỗi đơn ⇔ đúng 1 tài xế đang hoạt động, mọi lúc
Kiến trúc điều phối & định tuyến thời gian thực end-to-end

Phạm vi tự động hoá

  • API/WebSocket gán đơn cho tài xế, luồng ACK/từ chối, timeout tự động chuyển tài xế khác
  • SLA clock: đo thời gian gán, thời gian giao, phát hiện breach realtime
  • Cân bằng tải (load balancing) giữa các zone/khu vực khi phân bổ tài xế
  • Ngoài phạm vi: thuật toán tối ưu tuyến đường chi tiết bằng OR-Tools/bản đồ (do đội Data đảm nhiệm), UI bản đồ tài xế
Bài này lấy oracle là tính duy nhất của phép gán (mỗi đơn ⇔ đúng 1 tài xế đang hoạt động tại mọi thời điểm) và độ chính xác của đồng hồ SLA, không phải chất lượng thuật toán tối ưu tuyến đường.

2. Kiến trúc hệ thống & luồng nghiệp vụ

Kiến trúc gồm 5 thành phần chính: Order Intake (nhận đơn mới, xác định điểm lấy/giao), Routing Engine (tính khoảng cách, thời gian dự kiến, xếp hạng ứng viên tài xế), Assignment Service (giữ trạng thái gán, xử lý ACK/decline/timeout, đảm bảo tính duy nhất bằng lock phân tán), WebSocket Gateway (kênh hai chiều realtime giữ kết nối bền với hàng chục nghìn thiết bị tài xế), và SLA Clock Service (đo thời gian từ lúc đơn sẵn sàng tới lúc gán, và từ lúc gán tới lúc giao, phát cảnh báo khi gần vỡ SLA). Assignment Service dùng Redis với lệnh SET NX (set-if-not-exists) hoặc Lua script nguyên tử để giữ khoá 'orderId đang được gán cho driverId X', tránh race condition khi engine định tuyến trả về nhiều ứng viên gần như đồng thời cho các dispatcher worker khác nhau.

Điểm khó khi kiểm thử

  • Realtime + concurrency: nhiều đơn/nhiều tài xế xử lý song song, khó tái lập race condition ổn định
  • WebSocket bền kết nối: cần mô phỏng mất kết nối, reconnect, và tin nhắn đến trễ/mất gói
  • SLA clock phân tán: đồng hồ đo trên nhiều service phải nhất quán, lệch giờ server (clock skew) gây sai số
  • Cân bằng tải giữa zone: khó kiểm chứng 'công bằng' bằng một assertion đơn giản, cần đo phân phối thống kê
💡 Khi test WebSocket, dựng một test-double client giả lập tài xế có thể chủ động ngắt/nối lại kết nối theo kịch bản, thay vì phụ thuộc app thật để kiểm soát thời điểm mất mạng.

3. Mô hình dữ liệu & bất biến nghiệp vụ (oracle)

Thực thể trung tâm là Order với các trường: orderId, pickupZone, status (PENDING_ASSIGN, ASSIGNED, PICKED_UP, DELIVERING, DELIVERED, SLA_BREACHED), createdAt, assignedAt, deliveredAt. Thực thể Assignment ghi nhận mỗi lần hệ thống gán đơn cho tài xế: assignmentId, orderId, driverId, offeredAt, ackedAt (nullable), declinedAt (nullable), expiresAt. Thực thể DriverPresence theo dõi trạng thái realtime của tài xế qua WebSocket: driverId, connectionId, lastHeartbeatAt, currentZone, isAvailable. Cuối cùng, SLABreach ghi nhận mỗi lần một mốc SLA bị vi phạm: breachId, orderId, slaType (ASSIGNMENT hoặc DELIVERY), thresholdSeconds, actualSeconds, detectedAt — đây là dữ liệu dùng để tính KPI vận hành và để QA đối chiếu độ chính xác của SLA clock.

Bất biến bắt buộc (oracle)

🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 23% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!