安徽弘泰建设管理有限公司网站,万网网站备案授权书,wordpress目录设置,红色经典ppt模板免费下载在支付系统中#xff0c;如何确保支付状态的准确传递和处理显得尤为重要。今天#xff0c;我们将以一个支付流程为例#xff0c;探讨在引入RabbitMQ前后的实现和优化。
改造前
在引入RabbitMQ之前#xff0c;我们通常会直接在支付方法中完成所有的操作。这包括查询支付单…在支付系统中如何确保支付状态的准确传递和处理显得尤为重要。今天我们将以一个支付流程为例探讨在引入RabbitMQ前后的实现和优化。
改造前
在引入RabbitMQ之前我们通常会直接在支付方法中完成所有的操作。这包括查询支付单、判断状态、扣减余额、修改支付单状态以及通知订单服务等。以下是一个典型的实现
Override
Transactional
public void tryPayOrderByBalance(PayOrderFormDTO payOrderFormDTO) {// 1.查询支付单PayOrder po getById(payOrderFormDTO.getId());// 2.判断状态if (!PayStatus.WAIT_BUYER_PAY.equalsValue(po.getStatus())) {// 订单不是未支付状态异常throw new BizIllegalException(交易已支付或关闭);}// 3.尝试扣减余额userClient.deductMoney(payOrderFormDTO.getPw(), po.getAmount());// 4.修改支付单状态boolean success markPayOrderSuccess(payOrderFormDTO.getId(), LocalDateTime.now());if (!success) {throw new BizIllegalException(交易已支付或关闭);}// 5.修改订单状态tradeClient.markOrderPaySuccess(po.getBizOrderNo());
}代码解读
查询支付单通过支付单ID查询对应的支付单信息。判断支付状态检查支付单状态是否为“等待买家付款”如果状态异常则抛出业务异常。扣减用户余额调用用户服务尝试扣减用户余额。修改支付单状态如果扣减余额成功则更新支付单状态为“支付成功”。通知订单服务直接调用订单服务更新订单状态。
存在的问题
强耦合支付服务和订单服务强耦合修改其中一个模块可能会影响到另一个模块。失败处理如果在某一步骤失败整个流程需要回滚复杂度增加。可扩展性差难以扩展其他需要在支付成功后进行处理的业务逻辑。
改造后
为了提高系统的可靠性和可维护性我们引入RabbitMQ来实现支付状态的异步通知。改造后的代码如下
Override
Transactional
public void tryPayOrderByBalance(PayOrderFormDTO payOrderFormDTO) {// 1.查询支付单PayOrder po getById(payOrderFormDTO.getId());// 2.判断状态if (!PayStatus.WAIT_BUYER_PAY.equalsValue(po.getStatus())) {// 订单不是未支付状态异常throw new BizIllegalException(交易已支付或关闭);}// 3.尝试扣减余额userClient.deductMoney(payOrderFormDTO.getPw(), po.getAmount());// 4.修改支付单状态boolean success markPayOrderSuccess(payOrderFormDTO.getId(), LocalDateTime.now());if (!success) {throw new BizIllegalException(交易已支付或关闭);}// 5.发送支付成功消息try {rabbitTemplate.convertAndSend(pay.direct, pay.success, po.getBizOrderNo());} catch (AmqpException e) {log.error(发生支付状态通知失败订单id:{}, po.getBizOrderNo(), e);}
}public boolean markPayOrderSuccess(Long id, LocalDateTime successTime) {return lambdaUpdate().set(PayOrder::getStatus, PayStatus.TRADE_SUCCESS.getValue()).set(PayOrder::getPaySuccessTime, successTime).eq(PayOrder::getId, id)// 支付状态的乐观锁判断.in(PayOrder::getStatus, PayStatus.NOT_COMMIT.getValue(), PayStatus.WAIT_BUYER_PAY.getValue()).update();
}代码解读
查询支付单通过支付单ID查询对应的支付单信息。判断支付状态检查支付单状态是否为“等待买家付款”如果状态异常则抛出业务异常。扣减用户余额调用用户服务尝试扣减用户余额。修改支付单状态如果扣减余额成功则更新支付单状态为“支付成功”。发送支付成功消息通过RabbitMQ发送支付成功的消息通知其他系统或服务支付已完成。
异步通知的实现
改造后的系统中我们通过RabbitMQ实现了异步消息通知。以下是支付状态监听器的实现
Component
RequiredArgsConstructor
public class PayStatusListener {private final IOrderService orderService;RabbitListener(bindings QueueBinding(value Queue(name trade.pay.success.queue, durable true),exchange Exchange(name pay.direct),key pay.success))public void listenPaySuccess(Long orderId) {orderService.markOrderPaySuccess(orderId);}
}监听器解读
监听队列绑定支付成功的队列和交换机并指定路由键。处理消息监听到支付成功的消息后调用订单服务更新订单状态。
总结
通过引入RabbitMQ我们实现了支付状态的异步通知解决了系统强耦合、失败处理复杂、可扩展性差的问题。RabbitMQ不仅提高了系统的可靠性还使得系统更加易于维护和扩展。