
外卖跑腿配送系统本质上是一个“多角色 + 实时调度 + 地理位置驱动”的同城即时履约系统,核心围绕四个端:用户端、商家端、骑手端、管理后台。
下面从业务流程到技术架构,再到核心代码实现,带你完整拆解一套可落地的系统设计。

一个标准外卖跑腿系统通常采用分层+微服务/模块化架构:
外卖跑腿系统的主链路:
关键点在第3步:派单逻辑
订单是整个系统的核心数据结构。
CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT,
merchant_id BIGINT,
rider_id BIGINT,
status VARCHAR(20),
total_amount DECIMAL(10,2),
create_time DATETIME,
update_time DATETIME
);app.post("/order/create", async (req, res) => {
const { userId, merchantId, items } = req.body;
// 1. 计算金额
const total = items.reduce((sum, item) => {
return sum + item.price * item.count;
}, 0);
// 2. 创建订单
const order = await db.orders.create({
user_id: userId,
merchant_id: merchantId,
total_amount: total,
status: "PENDING"
});
// 3. 写入Redis用于派单
await redis.lpush("order_queue", order.id);
res.json({
success: true,
orderId: order.id
});
});外卖系统“智能化”的核心就在这里:如何匹配最近骑手
// 骑手上线(存位置)
await redis.geoadd(
"riders_location",
longitude,
latitude,
riderId
);const riders = await redis.georadius(
"riders_location",
orderLng,
orderLat,
3, // 3公里范围
"km",
"WITHDIST",
"COUNT",
5
);async function dispatchOrder(orderId, orderLng, orderLat) {
const riders = await redis.georadius(
"riders_location",
orderLng,
orderLat,
5,
"km",
"WITHDIST"
);
if (!riders.length) {
throw new Error("暂无可用骑手");
}
// 按距离排序
riders.sort((a, b) => a[1] - b[1]);
const selectedRider = riders[0][0];
// 更新订单
await db.orders.update({
where: { id: orderId },
data: {
rider_id: selectedRider,
status: "DISPATCHED"
}
});
// 通知骑手(WebSocket/MQTT)
notifyRider(selectedRider, orderId);
return selectedRider;
}骑手必须“秒级收到订单”
const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 });
wss.on("connection", (ws) => {
ws.on("message", (msg) => {
const data = JSON.parse(msg);
if (data.type === "rider_login") {
ws.riderId = data.riderId;
}
});
});
// 推送订单
function notifyRider(riderId, orderId) {
wss.clients.forEach(client => {
if (client.riderId === riderId) {
client.send(JSON.stringify({
type: "NEW_ORDER",
orderId
}));
}
});
}app.post("/rider/accept", async (req, res) => {
const { riderId, orderId } = req.body;
const order = await db.orders.findById(orderId);
if (order.status !== "DISPATCHED") {
return res.json({ success: false, msg: "订单已被接单" });
}
await db.orders.update({
where: { id: orderId },
data: {
status: "ACCEPTED",
rider_id: riderId
}
});
res.json({ success: true });
});骑手位置需要持续上报:
setInterval(() => {
navigator.geolocation.getCurrentPosition(async (pos) => {
await fetch("/rider/location/update", {
method: "POST",
body: JSON.stringify({
riderId,
lng: pos.coords.longitude,
lat: pos.coords.latitude
})
});
});
}, 5000);app.post("/rider/location/update", async (req, res) => {
const { riderId, lng, lat } = req.body;
await redis.geoadd("riders_location", lng, lat, riderId);
res.json({ success: true });
});const lock = await redis.set("order_lock_" + orderId, riderId, "NX", "EX", 10);
if (!lock) {
return "订单已被抢";
}如果要做商业级系统,必须加:

外卖跑腿配送系统的核心不是“下单”,而是:
实时调度 + 地理位置 + 多角色协同
真正的技术难点集中在三点:
如果这三块做好,系统才算真正可商用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。