一、系统架构设计
1. 整体架构
- 前端层:用户APP/小程序、骑手APP、商家管理端
- 服务层:订单服务、追踪服务、通知服务、地图服务
- 数据层:MySQL(订单主数据)、Redis(实时状态缓存)、MongoDB(轨迹数据)
- 第三方服务:地图API(高德/百度)、短信/推送网关
2. 核心组件
- 订单状态机:定义订单从创建到完成的完整生命周期状态
- 实时位置服务:骑手位置上报与分发
- WebSocket网关:建立长连接实现实时推送
- 轨迹存储系统:高效存储和查询位置轨迹
二、订单状态机设计
```mermaid
stateDiagram-v2
[*] --> 待支付
待支付 --> 已取消: 用户取消
待支付 --> 待接单: 支付成功
待接单 --> 配送中: 骑手接单
配送中 --> 已完成: 骑手送达
配送中 --> 已取消: 异常取消
```
三、实时追踪实现方案
1. 骑手位置上报
```java
// 骑手APP端伪代码
public void uploadLocation(double latitude, double longitude) {
// 1. 调用地图API获取当前地址信息
AddressInfo address = mapApi.reverseGeocode(latitude, longitude);
// 2. 构建位置数据包
RiderLocationPacket packet = new RiderLocationPacket(
orderId,
riderId,
latitude,
longitude,
address,
System.currentTimeMillis()
);
// 3. 上报到服务端
locationService.report(packet);
}
```
2. 服务端处理流程
```python
服务端处理伪代码
def handle_location_update(packet):
1. 验证骑手和订单有效性
if not validate_rider_order(packet.rider_id, packet.order_id):
return False
2. 存储最新位置到Redis
redis.hset(f"order:{packet.order_id}", mapping={
"rider_id": packet.rider_id,
"lat": packet.latitude,
"lng": packet.longitude,
"address": packet.address,
"timestamp": packet.timestamp
})
3. 存储轨迹点到MongoDB
mongo_collection.insert_one({
"order_id": packet.order_id,
"location": {
"type": "Point",
"coordinates": [packet.longitude, packet.latitude]
},
"timestamp": packet.timestamp,
"address": packet.address
})
4. 推送更新给相关用户
push_to_users(packet.order_id, {
"type": "location_update",
"data": {
"status": get_order_status(packet.order_id),
"location": {
"lat": packet.latitude,
"lng": packet.longitude,
"address": packet.address
}
}
})
```
3. 用户端实时显示
```javascript
// 前端WebSocket实现
const socket = new WebSocket(wss://your-api-domain/ws);
socket.onopen = () => {
// 订阅订单更新
socket.send(JSON.stringify({
type: "subscribe",
orderId: "123456"
}));
};
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === location_update) {
// 更新地图上的骑手位置
updateRiderMarker(data.location);
// 更新预计到达时间
updateETA(data.location);
}
};
```
四、关键技术实现
1. 实时位置处理
- 骑手位置上报频率:15-30秒/次(平衡实时性与电量消耗)
- 位置去噪算法:过滤异常跳跃点
- 轨迹压缩算法:减少存储空间
2. 预计到达时间(ETA)计算
```python
def calculate_eta(start_point, end_point, history_speed):
调用地图API获取路线距离和预计时间
route_info = map_api.get_route(start_point, end_point)
结合历史速度和实时路况调整
base_time = route_info[duration]
adjusted_time = base_time * (0.8 + 0.4 * (1 - history_speed_factor))
return max(adjusted_time, 5*60) 至少5分钟
```
3. 订单状态同步机制
- 最终一致性模型:允许短暂不一致,最终保证数据正确
- 版本号控制:每个状态变更携带版本号,防止覆盖
- 冲突解决策略:后写优先,特殊状态优先(如取消优先)
四、异常处理与容灾
1. 网络中断处理:
- 骑手端本地缓存位置数据,网络恢复后批量上传
- 用户端显示"最后已知位置"和更新时间
2. 服务降级策略:
- 高峰期关闭非核心功能(如轨迹动画)
- 使用本地缓存数据替代实时数据
3. 数据一致性保障:
- 订单状态变更触发轨迹快照
- 每日核对订单状态与轨迹数据
五、性能优化方案
1. 位置数据分区:按区域分片存储位置数据
2. 推送消息合并:10秒内同一订单的多次更新合并推送
3. WebSocket连接管理:心跳机制检测无效连接
4. CDN加速:静态资源使用CDN分发
六、监控与告警
1. 关键指标监控:
- 位置上报延迟
- WebSocket连接数
- 推送成功率
2. 告警阈值设置:
- 位置上报延迟>5秒
- WebSocket断开率>1%
- 推送失败率>0.5%
七、测试方案
1. 压力测试:
- 模拟10万并发订单追踪
- 测试不同网络条件下的表现
2. 场景测试:
- 正常订单流程
- 异常流程(取消、超时等)
- 边界条件测试(极远距离订单等)
八、部署方案
1. 容器化部署:
- 订单服务、追踪服务、通知服务独立容器
- 使用Kubernetes进行编排
2. 多可用区部署:
- 数据库主从跨可用区
- 状态服务Redis集群跨区
八、扩展功能建议
1. 智能预估:
- 基于历史数据和实时路况的更精准ETA
- 异常天气预警
2. 用户交互增强:
- 实时轨迹动画
- 骑手信息展示(评分、照片等)
3. 商家端功能:
- 订单准备进度追踪
- 备货完成通知
此方案可根据实际业务需求和技术栈进行调整,核心是实现订单全生命周期的实时可视化追踪,提升用户体验和运营效率。