在生鲜电商系统开发中,完善的异常处理机制是保障系统稳定运行、提升用户体验的关键。以下是针对美菜生鲜系统特点的异常处理机制设计方案:
一、异常处理的核心目标
1. 业务连续性保障:确保订单、支付、物流等核心业务流程不受异常影响
2. 数据一致性维护:防止因异常导致库存、订单状态等数据不一致
3. 用户体验优化:提供友好的错误提示和快速恢复方案
4. 问题快速定位:建立完善的异常监控和日志体系
二、生鲜系统常见异常场景
1. 供应链相关异常
- 供应商缺货/延迟供货
- 冷链运输温度异常
- 商品质量检测不合格
- 仓储库存数据不一致
2. 订单处理异常
- 支付失败/重复支付
- 库存超卖
- 地址无法配送
- 订单状态同步失败
3. 物流配送异常
- 配送员接单失败
- 配送路线规划异常
- 配送超时
- 签收异常
4. 系统级异常
- 微服务间调用超时
- 数据库连接中断
- 缓存雪崩/穿透
- 第三方服务不可用
三、分层异常处理架构设计
1. 表现层异常处理
```java
// 示例:Controller层统一异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity handleBusinessException(BusinessException e) {
return ResponseEntity.status(e.getStatusCode())
.body(new ErrorResponse(e.getCode(), e.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity handleSystemException(Exception e) {
log.error("系统异常", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("SYS_ERROR", "系统繁忙,请稍后重试"));
}
}
```
2. 业务服务层异常处理
```java
// 示例:库存服务中的异常处理
@Service
public class InventoryService {
@Transactional(rollbackFor = Exception.class)
public boolean deductInventory(Long skuId, int quantity) {
try {
// 查询库存
Inventory inventory = inventoryRepository.findBySkuId(skuId);
// 校验库存
if (inventory.getAvailable() < quantity) {
throw new BusinessException("INVENTORY_INSUFFICIENT", "库存不足");
}
// 扣减库存
inventory.setAvailable(inventory.getAvailable() - quantity);
inventoryRepository.save(inventory);
return true;
} catch (DataAccessException e) {
throw new BusinessException("DB_ERROR", "数据库操作异常", e);
}
}
}
```
3. 数据访问层异常处理
```java
// 示例:使用Spring Retry处理数据库重试
@Retryable(value = {DeadlockLoserDataAccessException.class},
maxAttempts = 3,
backoff = @Backoff(delay = 1000))
public void updateOrderStatus(Long orderId, OrderStatus status) {
// 更新订单状态逻辑
}
```
四、关键业务场景的异常处理方案
1. 库存超卖防护
- 解决方案:
- 数据库乐观锁(版本号控制)
- 分布式锁(Redis实现)
- 库存预占机制(下单时预扣,支付后确认)
```java
// 库存预占示例
public boolean reserveInventory(OrderItem item) {
String lockKey = "inventory_lock:" + item.getSkuId();
try {
// 获取分布式锁
boolean locked = redisLock.tryLock(lockKey, 5, TimeUnit.SECONDS);
if (!locked) {
throw new BusinessException("OPERATE_TOO_FREQUENT", "操作过于频繁");
}
// 实际库存操作...
} finally {
redisLock.unlock(lockKey);
}
}
```
2. 支付异常处理
- 场景:支付超时、支付结果通知丢失、重复支付
- 处理方案:
- 支付状态查询接口
- 异步通知确认机制
- 幂等性设计(支付订单号唯一性)
```java
// 支付结果处理示例
public void handlePaymentNotification(PaymentNotification notification) {
// 幂等性校验
if (paymentRepository.existsByMerchantOrderNo(notification.getMerchantOrderNo())) {
return; // 已处理过
}
// 业务处理...
}
```
3. 物流配送异常
- 场景:配送员无法联系收货人、地址无法送达
- 处理方案:
- 自动重试机制(限次)
- 人工干预通道
- 备用配送方案
五、监控与告警体系
1. 实时监控指标:
- 接口成功率
- 业务操作失败率
- 系统资源使用率
2. 告警策略:
- 阈值告警(如错误率超过1%)
- 趋势告警(错误率持续上升)
- 异常模式识别
3. 日志收集:
- 结构化日志(包含业务上下文)
- 异常堆栈完整记录
- 关联请求ID追踪
六、容灾与恢复机制
1. 数据备份:
- 核心数据实时备份
- 定期全量备份
2. 服务降级:
- 非核心功能降级
- 静态页面缓存
3. 快速恢复:
- 自动化部署流水线
- 蓝绿部署策略
- 数据库快速回滚方案
七、测试与演练
1. 混沌工程:
- 模拟网络故障
- 模拟服务宕机
- 模拟数据异常
2. 异常场景测试:
- 编写异常场景测试用例
- 自动化异常注入测试
- 压测与异常混合测试
八、实施建议
1. 渐进式实施:先核心业务后边缘业务
2. 标准化建设:统一异常码、错误消息格式
3. 文档化:维护异常处理知识库
4. 持续优化:基于监控数据迭代处理策略
通过完善的异常处理机制,美菜生鲜系统可以实现:
- 核心业务流程高可用性(99.9%以上)
- 异常情况平均恢复时间(MTTR)<5分钟
- 用户投诉率降低60%以上
- 运维效率提升40%以上
建议结合具体业务场景和技术栈,制定更详细的异常处理规范和实施方案。