做外卖配送系统,如果没有调度算法,本质上只是一个“下单+通知工具”。真正决定平台履约效率的,不是页面,而是调度机制。
一套成熟的外卖配送系统,核心要解决三个问题:
- 订单如何快速匹配骑手
- 如何降低配送总时长
- 如何平衡骑手负载与平台效率
下面直接讲实现思路。
一、调度模型基础设计
调度系统的本质是一个“多约束条件下的最优匹配问题”。
核心数据模型通常包含:
Order {
id
user_id
merchant_id
pickup_lat
pickup_lng
delivery_lat
delivery_lng
create_time
status
}
Rider {
id
current_lat
current_lng
status -- idle, delivering
current_load -- 当前配送数量
max_load
}
调度的目标:
在满足骑手容量约束的前提下,选择“综合成本最低”的骑手。
二、基础距离匹配算法
最简单的方式是“最近骑手优先”。
距离计算(Haversine公式)
import math
def haversine(lat1, lng1, lat2, lng2):
R = 6371 # 地球半径 km
dlat = math.radians(lat2 - lat1)
dlng = math.radians(lng2 - lng1)
a = math.sin(dlat/2)**2 + math.cos(math.radians(lat1)) \
* math.cos(math.radians(lat2)) * math.sin(dlng/2)**2
c = 2 * math.asin(math.sqrt(a))
return R * c
筛选逻辑:
def find_best_rider(order, riders):
best_rider = None
min_distance = float('inf')
for rider in riders:
if rider.status == "idle" and rider.current_load < rider.max_load:
distance = haversine(
order.pickup_lat,
order.pickup_lng,
rider.current_lat,
rider.current_lng
)
if distance < min_distance:
min_distance = distance
best_rider = rider
return best_rider
这种方式简单有效,但在订单量大时会出现问题:
- 骑手负载不均
- 忽略配送路径优化
- 高峰期效率低下
三、加权调度模型(推荐做法)
成熟系统不会只看距离,而是构建一个“综合评分模型”。
例如:
Score = α * 距离权重
+ β * 当前负载权重
+ γ * 历史效率权重
+ δ * 区域优先级
示例实现:
def calculate_score(order, rider):
distance = haversine(
order.pickup_lat,
order.pickup_lng,
rider.current_lat,
rider.current_lng
)
load_factor = rider.current_load / rider.max_load
efficiency = rider.avg_delivery_time # 平均配送时长
score = (
0.5 * distance +
0.3 * load_factor +
0.2 * efficiency
)
return score
然后选择最小 score 的骑手。
这种方式的好处是:
- 防止某个骑手被疯狂派单
- 提高整体配送均衡性
- 可根据运营策略动态调整权重

四、批量订单优化(进阶)
当系统进入高峰期,不能再用“单单匹配”,而要使用批量调度。
典型思路是:
- 将同区域订单聚合
- 使用路径优化算法(如 TSP 近似算法)
- 允许一名骑手顺路配送多个订单
示意逻辑:
def batch_assign(orders, rider):
# 简单示意:按距离排序
sorted_orders = sorted(
orders,
key=lambda o: haversine(
rider.current_lat,
rider.current_lng,
o.pickup_lat,
o.pickup_lng
)
)
return sorted_orders[:rider.max_load]
真实生产环境通常会结合:
- 贪心算法
- 动态规划
- 区域网格化调度
- 第三方地图路径API
五、系统架构层实现建议
调度系统建议独立为微服务:
order-service
rider-service
dispatch-service
payment-service
调度流程:
- 订单创建 → 推送消息队列
- dispatch-service 监听订单事件
- 计算候选骑手集合
- 生成调度结果
- 推送骑手端通知
示例伪代码:
def on_order_created(order_id):
order = get_order(order_id)
riders = get_nearby_riders(order)
best_rider = min(
riders,
key=lambda r: calculate_score(order, r)
)
assign_order(order, best_rider)
建议使用:
- Redis 做实时骑手位置缓存
- Kafka / RabbitMQ 做订单调度事件驱动
- 定时任务做超时重派

六、真正拉开差距的是什么?
很多外卖配送系统只做到“抢单模式”,把调度交给骑手自己。这种方式适合早期平台,但一旦订单上量,履约效率一定下降。
真正成熟的外卖配送系统,一定具备:
- 智能调度能力
- 批量订单处理能力
- 可调权重策略
- 高并发容错机制
调度算法决定配送效率,配送效率决定用户体验,用户体验决定复购率。
如果你在做外卖配送系统搭建,别把精力只放在前端页面。
真正的技术壁垒,在调度层。
这才是平台能跑多远的核心。