ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

代驾系统智能派单拆解:Redis GEO + 距离评分的派单链路怎么设计

2026/10/7 16:51:34 拓冰建站 浏览量
代驾系统智能派单拆解:Redis GEO + 距离评分的派单链路怎么设计 派单是代驾系统的调度核心用户下单后系统要在几秒内从成百上千个司机里选出“最合适的那几个”推送订单。派单慢用户等待流失派单不准司机不愿意接。本文拆解一套开源代驾系统的智能派单链路。源码地址https://gitee.com/zhoujian6666/biaoma-ride-car-service派单要解决的三个问题找得到怎么快速知道用户附近有哪些在线司机排得准附近司机里先推给谁转得动第一个没接怎么办怎么自动流转一、附近司机检索为什么用 Redis GEO如果每次都查数据库算距离高并发下数据库扛不住且实时性差。系统让所有在线司机的实时位置写入 Redis司机端通过 Netty WebSocket 长连接每隔几秒上报 GPS 坐标服务端用 Redis 的 GEO 数据结构GEOADD存“司机 ID → 经纬度”派单时用 GEOSEARCH或 GEORADIUS按“用户上车点 半径”一次性取出附近在线司机操作是内存级的延迟在毫秒级。同时用 Redis 记录司机在线状态离线或心跳超时的司机不会进候选集。二、排序不是只看距离取出附近司机后要综合多个维度打分排序距离离上车点越近优先级越高接驾时间短司机评分历史服务星级、好评率服务分/完单率取消率低、完单稳定的优先司机当前状态是否有未完成订单、是否设置忙碌实践中常用“加权打分”或“先硬过滤再排序”先用硬性条件在线、空闲、证件有效过滤再按距离和评分加权排序。三、推送与流转排序后的候选司机不是同时推送而是分轮取 Top N 司机通过 Netty 通道定向推送订单含预估里程与收入设置接单超时窗口如 15 - 30 秒有人抢单订单锁定通知其他司机该单已结束无人接单扩大搜索半径或降低条件进入下一轮推送多轮失败订单进入“调度失败”状态后台可介入改派或通知用户抢单并发控制多个司机同时点“抢单”时必须保证只成功一个。系统用分布式锁Redis或数据库乐观锁以订单 ID 为锁键第一个抢到的司机拿到锁、更新订单状态其余抢单请求直接返回“已被接”。派单和计价、推送的联动下单时先调用高德路径规划算预估里程配合计价引擎给出预估价推送内容带上预估价司机决策更清晰派单结果、状态变更通过领域事件触发 Netty 推送和 RabbitMQ 异步通知性能与稳定性细节位置上报有节流坐标变化太小或时间间隔太短不上报减轻写入压力Redis 操作设超时与降级缓存异常时可降级为数据库粗筛推送失败可补偿关键派单消息配合 MQ 做可靠投递项目其他模块除智能派单外系统还包含订单状态机、Netty WebSocket 实时推送、计价引擎、微信/支付宝支付、分润对账、管理后台。后端 管理后台已开源Java 17 Spring Boot 2.7 Vue可直接部署。源码https://gitee.com/zhoujian6666/biaoma-ride-car-service欢迎评论区交流派单与 LBS 相关设计觉得有用欢迎 Star。