一、需求分析
即时订单优先机制是小象买菜系统中保障用户快速收到商品的核心功能,主要解决以下问题:
1. 区分普通订单和即时订单(如30分钟达、1小时达)
2. 确保即时订单在采购、分拣、配送等环节获得优先处理
3. 平衡即时订单与普通订单的资源分配
二、系统架构设计
1. 订单分类模块
```java
public class Order {
private String orderId;
private OrderType type; // 普通/即时
private Date createTime;
private Date expectedDeliveryTime;
private double priorityScore; // 动态优先级分数
// 其他属性...
}
public enum OrderType {
REGULAR, IMMEDIATE
}
```
2. 优先级计算机制
即时订单优先级计算考虑因素:
- 订单类型权重(即时订单基础权重更高)
- 剩余配送时间(时间越紧迫优先级越高)
- 订单金额(大额订单可适当提高优先级)
- 用户等级(VIP用户可获得额外加成)
```java
public class PriorityCalculator {
public double calculatePriority(Order order) {
double baseScore = order.getType() == OrderType.IMMEDIATE ? 100 : 50;
long timeLeft = order.getExpectedDeliveryTime().getTime() - System.currentTimeMillis();
double timeFactor = Math.max(0, timeLeft / (1000 * 60)); // 转换为分钟
// 线性递减函数,时间越少优先级越高
double timeScore = 50 * (1 - Math.exp(-timeFactor / 15));
// 其他因素...
return baseScore + timeScore + order.getAmount() * 0.1;
}
}
```
三、核心功能实现
1. 订单接收与分类
```java
public class OrderService {
public void receiveOrder(OrderRequest request) {
Order order = convertToOrder(request);
if (request.isImmediate()) {
order.setType(OrderType.IMMEDIATE);
// 设置更短的预期配送时间
order.setExpectedDeliveryTime(
new Date(System.currentTimeMillis() + 30 * 60 * 1000));
}
orderRepository.save(order);
priorityQueue.add(order); // 加入优先级队列
}
}
```
2. 优先级队列管理
使用优先队列(堆结构)实现:
```java
public class PriorityOrderQueue {
private PriorityQueue queue = new PriorityQueue<>(
Comparator.comparingDouble(Order::getPriorityScore).reversed()
);
public void addOrder(Order order) {
order.setPriorityScore(priorityCalculator.calculatePriority(order));
queue.add(order);
}
public Order getNextOrder() {
return queue.poll(); // 总是返回优先级最高的订单
}
}
```
3. 采购环节优先处理
```java
public class ProcurementService {
public void processOrders() {
while (!priorityQueue.isEmpty()) {
Order order = priorityQueue.getNextOrder();
if (order.getType() == OrderType.IMMEDIATE) {
// 立即分配采购员
assignProcurementStaff(order);
// 跳过普通订单处理,先完成即时订单
continue;
}
// 处理普通订单...
}
}
}
```
4. 配送资源分配
```java
public class DeliveryService {
public void assignDelivery() {
List immediateOrders = getImmediateOrders();
// 优先分配即时订单
for (Order order : immediateOrders) {
DeliveryStaff staff = findAvailableStaff();
if (staff != null) {
staff.assignOrder(order);
} else {
// 启动紧急招募或外包配送
activateEmergencyDelivery(order);
}
}
// 然后处理普通订单...
}
}
```
四、数据库设计优化
订单表设计
```sql
CREATE TABLE orders (
id VARCHAR(32) PRIMARY KEY,
order_type ENUM(REGULAR, IMMEDIATE) NOT NULL,
create_time DATETIME NOT NULL,
expected_delivery_time DATETIME NOT NULL,
priority_score DECIMAL(10,2) DEFAULT 0,
status VARCHAR(20) NOT NULL,
-- 其他字段...
INDEX idx_priority (priority_score DESC, expected_delivery_time ASC),
INDEX idx_immediate (order_type, status)
);
```
五、实时监控与调整
1. 动态优先级调整:
- 每5分钟重新计算所有未完成订单的优先级
- 对即将超时的即时订单提升优先级
2. 资源预警机制:
```java
public class ResourceMonitor {
public void checkResource() {
int immediateCount = orderRepository.countByTypeAndStatus(
OrderType.IMMEDIATE, OrderStatus.UNASSIGNED);
if (immediateCount > MAX_IMMEDIATE_ORDERS) {
// 触发预警,暂停接收新即时订单或扩大配送能力
alertSystem.triggerAlert(AlertType.IMMEDIATE_ORDER_OVERFLOW);
}
}
}
```
六、技术实现要点
1. 高并发处理:
- 使用Redis实现分布式优先级队列
- 采用乐观锁处理订单状态变更
2. 性能优化:
- 对即时订单相关查询建立单独索引
- 使用缓存热点数据(如配送员位置)
3. 异常处理:
- 即时订单超时自动升级为加急处理
- 配送资源不足时自动触发备用方案
七、测试方案
1. 压力测试:
- 模拟高峰期即时订单占比30%的场景
- 验证系统响应时间和订单处理正确率
2. A/B测试:
- 对比不同优先级算法对用户满意度的影响
- 测试不同资源分配策略的效果
八、部署与运维
1. 弹性扩容:
- 根据即时订单量自动调整采购/配送微服务实例数
2. 监控指标:
- 即时订单平均处理时间
- 即时订单超时率
- 资源利用率
通过以上设计,小象买菜系统能够实现高效的即时订单优先处理机制,在保证普通订单服务质量的同时,显著提升即时订单的用户体验。