一、系统架构设计
1. 整体架构
- 前端:用户端小程序/APP + 配送员端APP
- 后端:微服务架构(订单服务、用户服务、配送服务、支付服务等)
- 数据库:MySQL(关系型数据) + Redis(缓存)
- 实时通信:WebSocket + MQTT协议
- 定位服务:高德/百度地图API
2. 核心组件
- 订单服务:处理订单全生命周期
- 实时追踪服务:专门处理位置数据和状态更新
- 消息推送服务:向用户推送订单状态变更
- API网关:统一接口管理
二、订单实时追踪实现方案
1. 数据流设计
```
用户下单 → 订单创建 → 分配配送员 → 配送员接单 →
实时位置上报 → 位置数据处理 → 状态更新 →
用户端实时展示 → 异常情况处理
```
2. 关键技术实现
(1) 配送员位置上报
```java
// 配送员APP端位置上报示例(Android)
public void uploadLocation(double latitude, double longitude) {
// 每5秒上报一次位置
LocationData data = new LocationData(
riderId,
latitude,
longitude,
System.currentTimeMillis()
);
// 通过WebSocket或HTTP上报到服务器
WebSocketClient.send(JSON.toJSONString(data));
}
```
(2) 服务器端处理
```java
// Spring Boot WebSocket处理示例
@ServerEndpoint("/ws/rider/{riderId}")
public class RiderLocationWebSocket {
@OnMessage
public void onMessage(String message, Session session) {
LocationData data = JSON.parseObject(message, LocationData.class);
// 1. 校验数据有效性
if (!validateLocation(data)) return;
// 2. 保存到Redis(带过期时间)
redisTemplate.opsForHash().put("rider:location:" + data.getRiderId(),
"latest", data);
// 3. 更新订单状态(如果需要)
orderService.updateOrderStatusByRiderLocation(data);
// 4. 推送更新给用户
pushService.sendLocationUpdateToUsers(data);
}
}
```
(3) 用户端实时展示
- 前端技术:
- 使用WebSocket保持长连接
- 百度/高德地图JS API展示配送员位置
- 定时刷新订单状态
```javascript
// 前端WebSocket连接示例
const socket = new WebSocket(wss://your-domain.com/ws/user/123);
socket.onmessage = function(event) {
const data = JSON.parse(event.data);
// 更新地图上的配送员位置
updateRiderMarker(data.latitude, data.longitude);
// 更新订单状态文本
updateOrderStatus(data.status);
};
```
3. 数据库设计
订单表(orders)
```sql
CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
rider_id BIGINT,
status TINYINT NOT NULL COMMENT 1:待接单 2:配送中 3:已完成 4:已取消,
total_amount DECIMAL(10,2) NOT NULL,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL,
-- 其他字段...
);
```
订单轨迹表(order_tracks)
```sql
CREATE TABLE order_tracks (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL,
rider_id BIGINT NOT NULL,
latitude DECIMAL(10,6) NOT NULL,
longitude DECIMAL(10,6) NOT NULL,
status TINYINT COMMENT 当前状态,
create_time DATETIME NOT NULL,
INDEX idx_order_id (order_id)
);
```
三、关键功能实现
1. 订单状态流转
```mermaid
graph TD
A[用户下单] --> B[待接单]
B --> C{配送员接单}
C -->|是| D[配送中]
C -->|否| B
D --> E{送达确认}
E -->|是| F[已完成]
E -->|否| G[异常处理]
```
2. 实时位置优化
- 数据压缩:只上传必要的位置信息
- 采样策略:根据配送状态动态调整上报频率
- 待接单:30秒/次
- 配送中:10秒/次
- 接近目的地:5秒/次
- 轨迹平滑:使用卡尔曼滤波等算法处理噪声数据
3. 异常情况处理
- 配送员离线:自动转单或通知客服
- 位置异常:检测不合理移动速度
- 超时预警:根据距离和时间预估送达时间
四、性能优化方案
1. 缓存策略:
- 配送员最新位置存Redis,设置5秒过期
- 订单状态变更使用本地缓存
2. 消息队列:
- 使用Kafka/RabbitMQ解耦位置上报和状态更新
- 异步处理非实时性要求高的操作
3. 地理围栏:
- 预先计算配送路径上的关键点
- 减少实时计算量
4. CDN加速:
- 静态资源通过CDN分发
- 地图瓦片缓存
五、安全考虑
1. 数据加密:
- WebSocket连接使用wss
- 敏感位置数据加密传输
2. 权限控制:
- 配送员只能查看自己的订单
- 用户只能查看自己的订单轨迹
3. 防篡改:
- 位置数据签名验证
- 操作日志审计
六、部署方案
1. 容器化部署:
- 使用Docker + Kubernetes
- 每个服务独立容器
2. 监控告警:
- Prometheus + Grafana监控系统
- 关键指标:位置上报延迟、消息堆积量
3. 灾备方案:
- 多可用区部署
- 数据库主从复制
七、测试方案
1. 单元测试:
- 覆盖核心业务逻辑
- 模拟各种订单状态
2. 压力测试:
- 模拟万级并发订单
- 测试位置上报性能
3. 真实场景测试:
- 实际配送路线测试
- 不同网络环境测试
八、扩展功能建议
1. 预计送达时间(ETA):
- 基于历史数据和实时路况计算
- 动态更新预计时间
2. 多级追踪:
- 商品分拣状态
- 配送员取货状态
- 送达确认流程
3. 用户互动:
- 实时聊天功能
- 配送员评价系统
通过以上方案,小象买菜系统可以实现高效、准确的订单实时追踪功能,提升用户体验和运营效率。