一、核心异常场景分类与处理策略
1. 数据一致性异常
- 场景:订单支付成功但库存未扣减、物流状态更新失败导致库存回滚错误。
- 处理:
- 采用最终一致性模型,通过消息队列(如RocketMQ)实现异步补偿。例如支付成功后发送库存扣减消息,若失败则触发重试机制(指数退避)。
- 引入分布式事务(如Seata),对强一致性要求的场景(如退款与库存恢复)进行原子操作。
2. 高并发与性能异常
- 场景:秒杀活动导致数据库连接池耗尽、API接口超时。
- 处理:
- 限流降级:通过Sentinel或Hystrix实现接口熔断,对非核心功能(如用户评价)进行降级。
- 缓存预热:活动前将商品信息加载至Redis,减少数据库压力。
- 异步化:将订单生成、支付通知等操作转为消息队列异步处理。
3. 第三方服务异常
- 场景:支付接口超时、物流API返回错误数据。
- 处理:
- 重试机制:对幂等操作(如查询订单状态)设置自动重试(最多3次,间隔递增)。
- 备用方案:支付失败时自动切换至备用支付通道(如微信→支付宝)。
- Mock数据:在测试环境模拟第三方服务故障,验证系统容错能力。
4. 业务逻辑异常
- 场景:用户下单时商品已售罄、配送地址超出服务范围。
- 处理:
- 前置校验:在用户提交订单前检查库存和配送范围,返回明确错误码(如`40001-库存不足`)。
- 事务回滚:若下单过程中发生异常,确保已扣减的库存、优惠券等资源回滚。
二、技术实现方案
1. 分层异常处理架构
- Controller层:捕获业务异常(如`BusinessException`),返回友好提示(如“商品已售罄”)。
- Service层:捕获数据访问异常(如`DataAccessException`),记录日志并触发补偿任务。
- DAO层:捕获SQL异常(如`SQLException`),进行数据库连接健康检查。
2. 全局异常处理器
```java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity handleBusinessException(BusinessException e) {
return ResponseEntity.badRequest()
.body(new ErrorResponse(e.getCode(), e.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity handleSystemException(Exception e) {
log.error("系统异常", e);
return ResponseEntity.internalServerError()
.body(new ErrorResponse("500", "系统繁忙,请稍后重试"));
}
}
```
3. 日志与监控
- 结构化日志:使用Logback+MDC记录请求ID、用户ID等上下文信息,便于问题追踪。
- 告警机制:通过Prometheus+Grafana监控异常率,超过阈值时触发企业微信/邮件告警。
- 链路追踪:集成SkyWalking或Zipkin,定位跨服务异常。
三、业务连续性保障
1. 容灾设计
- 多活架构:数据库主从同步+分库分表,避免单点故障。
- 静态资源CDN:商品图片、JS/CSS等静态资源部署至CDN,减少源站压力。
2. 数据备份与恢复
- 实时备份:订单、支付等核心数据通过Canal实时同步至备份库。
- 定期演练:每月进行一次故障恢复演练,验证备份数据的可用性。
3. 用户补偿机制
- 异常订单处理:对因系统故障导致的超时订单,自动发放补偿券(如10元无门槛券)。
- 客服工单:提供异常订单快速申诉入口,人工介入处理复杂问题。
四、测试与优化
1. 混沌工程
- 使用ChaosBlade模拟网络延迟、服务宕机等场景,验证系统容错能力。
- 测试用例示例:
- 模拟支付接口50%请求超时,观察系统是否自动重试并最终成功。
- 模拟数据库主从切换,验证读写分离是否正常工作。
2. 性能压测
- 通过JMeter模拟秒杀场景,监控TPS、错误率等指标,优化瓶颈点(如锁竞争、缓存穿透)。
3. AB测试
- 对新异常处理策略(如重试次数)进行灰度发布,对比用户投诉率和系统稳定性。
五、案例参考
- 美团买菜:通过自研分布式事务框架解决库存超卖问题,异常订单率下降至0.01%。
- 每日优鲜:采用Sentinel实现接口限流,大促期间系统可用性保持99.95%。
总结
美菜生鲜系统的异常处理需结合业务特点,通过预防(前置校验)、容错(重试/降级)、恢复(补偿机制)三阶段构建闭环。技术上需兼顾实时性与一致性,业务上需平衡用户体验与系统复杂度。建议定期复盘异常日志,持续优化处理策略。