TopDev AI Robot TopDev
#Backend & Microservices#Kiến trúc & System Design#Giải đề & Thuật toán

Thiết kế hàng đợi ưu tiên (Priority Queue) cho hệ thống gọi xe công nghệ (Ride Hailing)

Hoàng Nam (Tech Lead)
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview

Bài toán ghép cuốc xe trong giờ cao điểm trời mưa Vào lúc 18h trời mưa to tại trung tâm thành phố, có 5.000 khách hàng cùng bấm đặt xe trên ứng dụng Grab / Be, nhưng trong bán kính 2km chỉ có 300 tài…

☰ Mục lục bài viết (4 phần) Mở / Đóng mục lục

Bài toán ghép cuốc xe trong giờ cao điểm trời mưa#

Vào lúc 18h trời mưa to tại trung tâm thành phố, có 5.000 khách hàng cùng bấm đặt xe trên ứng dụng Grab / Be, nhưng trong bán kính 2km chỉ có 300 tài xế đang hoạt động.

Nếu hệ thống dùng hàng đợi thông thường (First-In-First-Out - FIFO): Khách nào bấm trước được phục vụ trước. Tuy nhiên trong thực tế kinh doanh, hệ thống cần ưu tiên:

  • Khách hàng hạng Bạch Kim (Platinum Members).
  • Chuyến đi có quãng đường dài mang lại doanh thu cao.
  • Chuyến xe cấp cứu y tế khẩn cấp.

Cấu trúc dữ liệu nào giúp hệ thống ghép cặp tài xế và khách hàng tối ưu nhất?

Cấu trúc dữ liệu: Nhị phân Heap (Binary Min/Max-Heap)#

Hàng đợi ưu tiên (Priority Queue) cho phép:

  • Thêm một cuốc xe mới vào hàng đợi với độ phức tạp $O(\log N)$.
  • Lấy ra cuốc xe có độ ưu tiên cao nhất ngay lập tức trong $O(1)$ (hoặc $O(\log N)$ khi cân bằng lại Heap).
TYPESCRIPT
interface RideRequest {
  bookingId: string;
  userId: string;
  score: number; // Điểm ưu tiên tổng hợp
}

// Hàm tính điểm ưu tiên dựa trên nhiều trọng số
function calculatePriorityScore(userTier: string, tripDistanceKm: number, waitTimeMinutes: number): number {
  let score = 0;
  if (userTier === 'PLATINUM') score += 50;
  if (userTier === 'GOLD') score += 30;
  
  score += tripDistanceKm * 2;       // Ưu tiên chuyến đi xa
  score += waitTimeMinutes * 5;      // Chờ càng lâu điểm càng cao (tránh starvation)
  return score;
}

Tránh hiện tượng "Bỏ đói" (Starvation)#

Nếu chỉ ưu tiên khách VIP, một khách hàng hạng thường có thể phải đứng chờ dưới mưa suốt 2 tiếng mà không bao giờ được phục vụ.

  • Giải pháp: Cơ chế Aging (Gia tăng điểm theo thời gian). Cứ mỗi phút khách hàng phải chờ đợi, điểm ưu tiên của họ sẽ được cộng thêm 5 điểm, đảm bảo sau một khoảng thời gian nhất định họ sẽ vươn lên đầu hàng đợi!

Góc thảo luận#

Trong hệ thống thực tế phân tán, anh em triển khai Priority Queue bằng Redis Sorted Sets (ZADD với score) hay dùng module hàng đợi chuyên dụng?


Xem thêm nội dung liên quan:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Thu Trang (Backend Engineer)
    #1

    Dùng Redis Sorted Sets (ZADD score member) là lựa chọn hàng đầu cho bài toán này ở quy mô phân tán. Lệnh ZPOPMAX lấy ra phần tử có score cao nhất với độ phức tạp $O(\log N)$ cực kỳ nhanh.

Bài liên quan trong #Backend & Microservices

1
TopDev AI Companion
AI
✓ Đã sao chép link