跳转到内容

Scenario 25: Uber/滴滴 打车平台

V1 — 1人用:纯前端地图+预估价格

Section titled “V1 — 1人用:纯前端地图+预估价格”

你想做一个打车应用原型,体验地图选点和价格预估。

  • Leaflet地图展示
  • 手动输入或点选起终点
  • 显示直线距离和预估价格
  • 不同车型(快车/专车)价格对比

用HTML+CSS+JS+Leaflet做一个打车页面。地图全屏,底部浮层操作区。 用户点击地图选择起点(绿色标记)和终点(红色标记),画直线连接。 计算直线距离(Haversine公式),预估价格=起步价8元+每公里2.5元(快车) 或起步价15元+每公里4元(专车)。底部显示两种车型的预估价格和预计时间。 历史叫车记录存localStorage(起终点、价格、时间)。支持地址搜索框 (用Nominatim免费API反查坐标)。

  • 地图点选起终点标记正确
  • 距离计算和价格预估合理
  • 两种车型价格对比展示
  • 地址搜索返回正确位置
  • Leaflet地图集成 → Module: 地图API
  • Haversine距离公式 → Module: 地理计算
  • 地理编码 → Module: 位置服务

V2 — 10人用:乘客发单+司机接单

Section titled “V2 — 10人用:乘客发单+司机接单”

需要真实的发单和接单流程,乘客和司机双端。

  • 乘客发起叫车请求
  • 司机列表和简单匹配(最近的空闲司机)
  • 司机接单/拒单
  • 订单状态流转

Go+Gin后端,SQLite。用户表(id, name, role: rider/driver, lat, lng), 订单表(id, rider_id, driver_id, pickup_lat/lng, dest_lat/lng, status, price, created_at)。 乘客叫车:POST /api/orders(起终点坐标),系统查找最近的空闲司机 (Haversine距离排序,取最近3个)。推送给最近司机(轮询模拟), 司机接单POST /api/orders/:id/accept 或拒单。 订单状态:waiting→accepted→picked_up→completed→rated。 司机端页面:显示附近订单,一键接单。乘客端:等待接单动画,显示司机信息。

  • 叫车后匹配到最近空闲司机
  • 司机接单后订单状态更新
  • 订单状态流转完整
  • 乘客端显示司机信息
  • 地理位置匹配 → Module: LBS基础
  • 订单状态机 → Module: 状态机设计
  • 双端交互设计 → Module: 多角色系统

需要实时追踪司机位置,用空间数据库高效查询附近司机。

  • WebSocket实时上报司机位置
  • PostGIS空间查询(范围内的司机)
  • 实时地图展示司机位置
  • 行程实时追踪

PostgreSQL + PostGIS扩展。司机位置表(driver_id, location GEOGRAPHY(Point, 4326), status, updated_at)。司机端WebSocket每5秒上报位置,更新数据库。 匹配查询:ST_DWithin(location, ST_MakePoint(lng,lat)::geography, 3000) 查找3公里内空闲司机,按距离排序。GIST索引加速空间查询。 乘客端WebSocket:接单后实时推送司机位置(每3秒),地图上显示司机移动轨迹。 行程追踪:接单后记录司机轨迹点(存表),行程结束后根据实际轨迹计算里程和费用。 实际距离用轨迹点累加(非直线距离)。

  • WebSocket位置上报稳定
  • PostGIS范围查询正确返回附近司机
  • 乘客端实时看到司机移动
  • 实际里程计算基于真实轨迹
  • PostGIS空间查询 → Module: 地理信息系统
  • WebSocket实时通信 → Module: 实时推送
  • 轨迹里程计算 → Module: GPS数据处理

V4 — 1000人用:动态定价+ETA预估

Section titled “V4 — 1000人用:动态定价+ETA预估”

高峰期供不应求,需要动态调价平衡供需。

  • 供需比计算(某区域的乘客请求数/空闲司机数)
  • 动态溢价系数
  • 预估到达时间(ETA)
  • 价格透明度(展示溢价原因)

区域划分:将城市划分为网格(每格1km x 1km,用geohash前6位)。 供需计算:每个网格统计最近5分钟的叫车请求数和空闲司机数,计算供需比。 动态定价:供需比>2时开始溢价,系数=min(供需比0.5, 3.0),即最高3倍。 价格=基础价溢价系数,前端明确展示”当前需求较高,价格上浮X倍”。 ETA预估:根据司机到起点的直线距离,乘以道路系数1.4(模拟实际路程), 除以平均车速30km/h,得到预估分钟数。Redis缓存各区域的供需数据(30秒TTL)。

  • 供需比正确反映区域热度
  • 溢价系数不超过上限3倍
  • 价格页面清晰展示溢价原因
  • ETA预估误差<30%
  • Geohash区域划分 → Module: 空间索引
  • 动态定价算法 → Module: 定价策略
  • 供需平衡 → Module: 市场机制

V5 — 1万人用:多因子匹配+订单状态机

Section titled “V5 — 1万人用:多因子匹配+订单状态机”

简单的”最近司机”匹配不够,需要综合多个因素分配最优司机。

  • 多因子匹配评分(距离+评分+顺路+接单率)
  • 完整的订单状态机(含取消、异常、投诉)
  • 司机调度优化(减少空驶率)
  • 服务质量监控

多因子匹配:对候选司机打分,score = 距离分0.4 + 评分分0.2 + 顺路分0.3 + 接单率0.1。 距离分:3km内100分,线性递减到0分(10km)。评分分:司机评分20。 顺路分:司机当前行驶方向与去接乘客方向的夹角,<30度100分,线性递减。 接单率:最近50单的接单率100。取得分最高的司机派单。 订单状态机完整版:waiting→matched→driver_arriving→picked_up→in_trip→completed。 异常状态:cancelled_by_rider, cancelled_by_driver, no_driver_found, disputed。 取消规则:司机接单前免费取消,接单后3分钟内免费,超过收取5元取消费。 质量监控:差评订单自动触发回访,投诉工单系统。

  • 多因子打分合理,最优司机被分配
  • 所有状态流转路径正确
  • 取消规则按时间正确计费
  • 差评触发自动回访流程
  • 多因子评分模型 → Module: 匹配算法
  • 复杂状态机 → Module: 状态机设计进阶
  • 服务质量管理 → Module: SLA管理

全城海量订单,需要全局最优调度和拼车降本。

  • 区域分片调度(城市分区,区域内独立调度)
  • 跨区域调度(边界区域的司机共享)
  • 拼车算法(顺路匹配+动态拼单)
  • 热力图预测+运力预调度

区域分片:城市按行政区分片,每个分片独立的调度服务实例。 边界处理:边界2km范围内的司机同时注册到相邻分片,跨区订单两个分片协调。 拼车算法:新订单进来,检查是否可拼入已有行程——条件:顺路度>70%(新增绕路<30%), 车内<3人,预计延长时间<10分钟。拼车价格=独乘价*0.7。 热力图预测:用前几周同时段数据,预测未来30分钟各区域的订单量。 运力预调度:预测高需求区域提前引导空闲司机前往(推送”前往XX区域接单奖励+5元”)。 全局Dashboard:实时订单热力图、运力分布、平均等待时间、拼车率。

  • 分片调度各区域独立运行
  • 跨区域订单正确协调
  • 拼车匹配顺路度计算准确
  • 预测引导后高需求区域等待时间下降
  • 热力图实时更新延迟<1分钟
  • 分片调度架构 → Module: 分布式调度
  • 拼车算法 → Module: 路径优化
  • 需求预测 → Module: 时序预测