异常处理机制的重要性
在生鲜电商系统中,异常处理机制是保障系统稳定性和用户体验的关键组成部分。美菜生鲜系统作为B2B生鲜供应链平台,需要处理大量实时订单、库存管理和物流配送,异常处理机制尤为重要。
核心异常场景分析
1. 订单处理异常
- 用户下单时库存不足
- 支付失败或超时
- 订单地址无效或无法配送
- 重复订单或并发订单冲突
2. 供应链异常
- 供应商缺货或延迟供货
- 采购价格异常波动
- 质检不合格
- 仓储库存数据不一致
3. 物流配送异常
- 配送地址无法到达
- 配送员接单失败
- 配送超时
- 货物损坏或丢失
4. 系统级异常
- 数据库连接失败
- 第三方服务不可用(支付、短信等)
- 接口调用超时
- 服务器负载过高
异常处理机制设计原则
1. 预防优于处理:通过前置校验减少异常发生
2. 分级处理:根据异常严重程度采取不同策略
3. 可追溯性:完整记录异常信息便于排查
4. 用户友好:对用户展示适当的提示信息
5. 自动恢复:尽可能实现自动重试或回滚
6. 监控报警:及时发现并处理系统级异常
具体实现方案
1. 异常分类与编码体系
```java
public enum ExceptionType {
// 业务异常 1000-1999
INVENTORY_SHORTAGE(1001, "库存不足"),
PAYMENT_FAILED(1002, "支付失败"),
// 系统异常 2000-2999
DATABASE_ERROR(2001, "数据库异常"),
THIRD_PARTY_SERVICE_ERROR(2002, "第三方服务异常"),
// 数据异常 3000-3999
DATA_VALIDATION_ERROR(3001, "数据校验失败");
private final int code;
private final String message;
// 构造方法、getter省略
}
```
2. 统一异常处理框架
```java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity
handleBusinessException(BusinessException e) {
// 业务异常处理
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(ApiResponse.error(e.getCode(), e.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity handleSystemException(Exception e) {
// 系统异常处理,记录日志并返回友好提示
log.error("系统异常", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(ApiResponse.error(500, "系统繁忙,请稍后再试"));
}
}
```
3. 订单处理异常处理示例
```java
@Transactional
public Order createOrder(OrderDTO orderDTO) {
try {
// 1. 校验库存
if (!inventoryService.checkStock(orderDTO.getSkuList())) {
throw new BusinessException(ExceptionType.INVENTORY_SHORTAGE);
}
// 2. 创建订单
Order order = orderConverter.convert(orderDTO);
orderRepository.save(order);
// 3. 扣减库存
inventoryService.deductStock(orderDTO.getSkuList());
return order;
} catch (BusinessException e) {
// 业务异常直接抛出
throw e;
} catch (DataAccessException e) {
// 数据库异常,尝试回滚库存
try {
inventoryService.rollbackStock(orderDTO.getSkuList());
} catch (Exception rollbackEx) {
log.error("库存回滚失败", rollbackEx);
}
throw new SystemException(ExceptionType.DATABASE_ERROR, e);
}
}
```
4. 支付异常处理机制
```java
public PaymentResult processPayment(PaymentRequest request) {
int retryCount = 0;
final int maxRetry = 3;
while (retryCount < maxRetry) {
try {
// 调用支付接口
PaymentResponse response = paymentClient.pay(request);
if (response.isSuccess()) {
return PaymentResult.success(response);
}
// 支付失败但可重试的错误码
if (isRetryableError(response.getErrorCode())) {
retryCount++;
Thread.sleep(1000 * retryCount); // 指数退避
continue;
}
return PaymentResult.fail(response.getErrorMessage());
} catch (PaymentException e) {
if (e.isNetworkError()) {
retryCount++;
if (retryCount >= maxRetry) {
// 达到最大重试次数,记录异常并返回失败
paymentExceptionLogger.log(e, request);
return PaymentResult.fail("支付系统繁忙,请稍后再试");
}
Thread.sleep(1000 * retryCount);
continue;
}
throw e;
}
}
return PaymentResult.fail("未知支付错误");
}
```
5. 物流异常处理
```java
public DeliveryResult assignDelivery(Order order) {
try {
// 尝试分配配送员
DeliveryAssignment assignment = deliveryScheduler.assign(order);
// 检查配送范围
if (!deliveryService.isInDeliveryRange(order.getAddress())) {
throw new DeliveryException(ExceptionType.OUT_OF_DELIVERY_RANGE);
}
return DeliveryResult.success(assignment);
} catch (DeliveryException e) {
// 记录异常并尝试备用方案
log.warn("配送分配失败: {}", e.getMessage());
// 尝试备用配送方案
if (tryFallbackDelivery(order)) {
return DeliveryResult.successWithFallback();
}
// 通知客服介入
notifyCustomerService(order);
return DeliveryResult.failureRequiresManualHandling();
}
}
```
监控与报警机制
1. 异常日志收集:使用ELK(Elasticsearch+Logstash+Kibana)或Sentry收集和分析异常
2. 实时报警:对关键业务异常设置阈值报警(如订单失败率>5%)
3. 异常看板:可视化展示各类异常发生频率和趋势
4. 自动修复:对可自动修复的异常(如临时网络问题)设置自动重试机制
测试策略
1. 单元测试:覆盖所有异常场景
2. 集成测试:模拟上下游系统异常
3. 混沌工程:随机注入故障测试系统韧性
4. 压力测试:在高并发下验证异常处理能力
持续优化
1. 定期分析异常日志,优化处理逻辑
2. 根据业务变化调整异常分类和阈值
3. 完善降级方案,确保核心功能可用
4. 建立异常处理SOP(标准操作流程)供客服参考
通过完善的异常处理机制,美菜生鲜系统能够在面对各种突发情况时保持稳定运行,最大限度减少对业务的影响,同时提供良好的用户体验。