一、系统架构设计
1. 整体架构
采用微服务架构,主要包含以下服务:
- 用户服务
- 订单服务
- 配送服务
- 实时追踪服务
- 通知服务
2. 技术栈选择
- 前端:React/Vue + WebSocket
- 后端:Spring Cloud/Node.js + WebSocket
- 数据库:MySQL(订单数据) + Redis(实时状态缓存)
- 地图服务:高德/百度地图API
- 消息队列:Kafka/RabbitMQ
二、订单实时追踪核心功能实现
1. 订单状态流转设计
```
创建订单 → 商家接单 → 骑手接单 → 骑手取货 → 配送中 → 完成/异常
```
2. 实时位置追踪实现
(1) 骑手端实现
```javascript
// 骑手App定期上报位置
function reportLocation() {
navigator.geolocation.getCurrentPosition(position => {
const locationData = {
riderId: riderId,
orderId: currentOrderId,
latitude: position.coords.latitude,
longitude: position.coords.longitude,
timestamp: new Date().getTime()
};
// 通过WebSocket或HTTP上报到服务器
socket.emit(update-location, locationData);
// 或
fetch(/api/rider/location, {
method: POST,
body: JSON.stringify(locationData)
});
});
setTimeout(reportLocation, 5000); // 每5秒上报一次
}
```
(2) 服务器端处理
```java
// Spring Boot示例
@RestController
@RequestMapping("/api/rider")
public class RiderLocationController {
@Autowired
private RedisTemplate redisTemplate;
@PostMapping("/location")
public ResponseEntity<?> updateLocation(@RequestBody RiderLocation location) {
// 存储到Redis,设置过期时间
String key = "rider:location:" + location.getOrderId();
redisTemplate.opsForValue().set(key,
String.format("%s,%s", location.getLatitude(), location.getLongitude()),
1, TimeUnit.MINUTES);
// 通知所有订阅该订单的用户
WebSocketUtil.sendToOrderUsers(location.getOrderId(),
new LocationUpdate(location.getLatitude(), location.getLongitude()));
return ResponseEntity.ok().build();
}
}
```
3. 用户端实时查看
(1) WebSocket连接
```javascript
// 用户端建立WebSocket连接
const socket = new WebSocket(wss://your-domain.com/ws);
// 订阅订单更新
function subscribeToOrder(orderId) {
socket.onopen = () => {
socket.send(JSON.stringify({
type: subscribe,
orderId: orderId
}));
};
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === location-update) {
updateMap(data.latitude, data.longitude);
}
};
}
```
(2) 地图展示
```javascript
function updateMap(latitude, longitude) {
// 使用地图API更新骑手位置
const marker = new AMap.Marker({
position: new AMap.LngLat(longitude, latitude)
});
map.add(marker);
map.setCenter([longitude, latitude]);
// 计算并显示预计到达时间
calculateETA(latitude, longitude);
}
```
三、关键功能模块实现
1. 订单状态同步机制
- 使用WebSocket实现双向实时通信
- 状态变更时触发通知
- 离线消息队列处理
2. 预计到达时间(ETA)计算
```python
伪代码示例
def calculate_eta(start_lat, start_lng, end_lat, end_lng):
调用地图API获取路线信息
route_info = map_api.get_route(start_lat, start_lng, end_lat, end_lng)
考虑实时交通情况
traffic_factor = get_traffic_factor(route_info[road_id])
计算ETA(分钟)
distance = route_info[distance] / 1000 公里
speed = 15 * traffic_factor 基础速度15km/h,乘以交通系数
eta = distance / speed * 60
return max(2, round(eta)) 至少2分钟
```
3. 异常情况处理
- 骑手长时间未更新位置
- 订单超时未完成
- 用户取消订单
- 商品问题反馈
四、数据库设计
1. 订单表(orders)
```
id (PK)
user_id
shop_id
rider_id
status
total_amount
create_time
update_time
estimated_delivery_time
actual_delivery_time
```
2. 订单位置历史表(order_locations)
```
id (PK)
order_id (FK)
rider_id (FK)
latitude
longitude
timestamp
```
3. 实时位置缓存(Redis)
```
Key: rider:location:{orderId}
Value: latitude,longitude
TTL: 1分钟
```
五、性能优化方案
1. 位置数据优化:
- 骑手位置上报频率动态调整(静止时降低频率)
- 使用GeoHash编码存储位置数据
- 实现位置数据的批量上报
2. WebSocket连接管理:
- 连接心跳检测
- 连接复用
- 连接数限制
3. 缓存策略:
- 多级缓存(Redis + 本地缓存)
- 缓存预热
- 缓存失效策略
六、安全考虑
1. 位置数据加密传输
2. 用户隐私保护(仅订单相关方可见)
3. 防止位置数据伪造
4. 接口权限控制
七、部署方案
1. 容器化部署:
- 使用Docker容器化各个服务
- Kubernetes编排管理
2. 监控告警:
- 实时追踪服务健康检查
- 位置更新延迟监控
- 异常情况告警
3. 扩展性设计:
- 水平扩展WebSocket服务
- 分库分表设计
- 读写分离
八、测试方案
1. 单元测试:
- 位置计算逻辑
- 状态流转验证
2. 集成测试:
- 订单全流程测试
- 实时追踪准确性测试
3. 压力测试:
- 模拟高并发订单
- 大量位置数据上报测试
4. 真实场景测试:
- 不同网络环境测试
- 各种异常情况测试
通过以上方案实现,小象买菜系统可以提供稳定、准确的订单实时追踪功能,提升用户体验和平台运营效率。