業務流程
1. 客戶下單 → 後台計算最近司機列表(按距離排序)。
2. 依次推送給司機,每單設置超時定時器(如 30 秒)。
3. 司機接單 → 取消定時器,確認訂單狀態,結束流程。
4. 超時未響應 → 取消當前推送,推送給下一位司機,重複步驟 2-4。
5. 列表耗盡 → 標記訂單「無司機響應」,通知客服/客戶。
核心數據結構
class OrderDispatch {
String orderId;
List candidateDrivers; // 已排序
int currentIndex = 0;
ScheduledFuture> timeoutTask;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
}
關鍵代碼
void dispatchNext() {
if (currentIndex >= candidateDrivers.size()) { handleNoDriver(); return; }
Driver d = candidateDrivers.get(currentIndex++);
pushToDriver(d); // 個推/FCM
timeoutTask = scheduler.schedule(() -> {
if (orderStatus == PENDING) dispatchNext(); // 超時流轉
}, 30, TimeUnit.SECONDS);
}
void onDriverAccept(String driverId) {
if (timeoutTask != null) timeoutTask.cancel(false);
// 確認訂單、更新狀態、通知其他候選司機「已被搶單」
}
性能優化
- 使用時間輪或
DelayQueue 替代 ScheduledExecutorService,支持百萬級定時任務低開銷。
- 推送結果異步回調更新狀態,避免阻塞調度線程。
- 司機位置用 Redis Geo (GEORADIUS) 實時查詢最近 N 位。