RabbitMQ高级篇之延迟消息 介绍

延迟消息的概念

  • 延迟消息是指发送者在发送消息时,指定一个时间,消费者在指定时间后才能接收到消息,而不是立即接收。
  • 延迟消息的作用:可以让消费者在一定时间后才处理消息,用来实现一些“等待”和“重试”的逻辑。例如,支付服务可以在支付订单超时未支付的情况下,主动查询支付状态,保证两者一致性。



支付与交易服务一致性问题

在微服务架构中,支付服务和交易服务通常会通过消息队列(MQ)来实现解耦和异步通知。然而,若出现不可抗因素导致支付通知失败,则支付服务和交易服务的状态可能不一致。常见问题包括:

  • 支付成功,但交易服务没有收到支付通知:交易服务中的订单仍然显示为“未支付”,而支付服务中的支付流水已改为“已支付”。
  • 支付失败,但商品库存已被扣减:交易服务未收到支付失败的通知,导致库存状态不一致,商品被锁定但并未支付,其他用户无法购买该商品。



解决方案:延迟消息

延迟消息可以作为解决支付与交易服务一致性问题的一种兜底方案。具体思路是:

  • 在用户下单后,交易服务发送延迟消息到MQ,设定一定的超时时间(例如30分钟)。
  • 延迟消息在超时后会被投递给交易服务。交易服务通过查询支付服务的状态来确认支付是否完成,若支付成功,更新订单状态为“已支付”;若支付未成功,则取消订单并恢复库存。



支付订单流程

  1. 用户下单:交易服务接收到下单请求,创建订单并将状态设置为“未支付”,同时扣减商品库存。
  2. 发送延迟消息:交易服务发送一条延迟消息到RabbitMQ,设置延迟时间(例如30分钟)。延迟消息的作用是等待用户支付,如果在指定时间内未收到支付通知,交易服务会主动检查支付状态。
  3. 检查支付状态:30分钟后,延迟消息被消费者接收,交易服务检查订单是否已支付:
    • 已支付:更新订单状态为“已支付”,并完成后续流程。
    • 未支付:取消订单并恢复库存,确保库存可供其他用户购买。



延迟消息的实现

延迟消息可以通过以下两种方式实现:

  1. 死信交换机(Dead Letter Exchange,DLX):通过设置死信交换机和死信队列来模拟延迟消息。当消息在队列中存活超过指定时间后,它会变成死信消息,进而被投递到另一个交换机或队列,消费者可以从该队列中接收消息并执行相关业务逻辑。
  2. 延迟插件(RabbitMQ Delayed Message Plugin):RabbitMQ提供了延迟消息插件(rabbitmq-delayed-message-exchange),该插件允许通过交换机直接支持消息延迟投递。可以在发送消息时指定延迟时间,消息会在队列中等待指定时间后才会被消费者消费。



延迟消息的业务场景

延迟消息常用于以下场景:

  • 支付超时取消:在用户支付超时未完成时,自动取消订单并恢复库存。
  • 延迟任务执行:某些任务需要在特定时间后执行,例如定时任务、超时检查等。
  • 缓解瞬时流量压力:通过延迟消息处理流量突发,减轻后端服务压力。



总结

通过使用延迟消息机制,可以有效地实现支付服务和交易服务之间的一致性。在支付超时未支付的情况下,延迟消息帮助交易服务主动查询支付状态并采取相应的措施,如更新订单状态或取消订单,保证了系统状态的一致性。



关键技术点

  • 延迟消息:指定时间后才会发送到消费者。
  • 死信交换机(DLX):模拟延迟消息,通过消息在队列中存活指定时间后变为死信。
  • RabbitMQ Delayed Message Plugin:直接支持延迟消息的投递,简化了延迟消息的实现。


业务流程总结

  1. 用户下单,发送延迟消息到RabbitMQ。
  2. 延迟时间到后,交易服务检查支付状态。
  3. 根据支付状态,更新订单或取消订单,恢复库存。



实践建议

  • 对于重要的业务操作,应该考虑使用延迟消息机制来避免因系统异常导致的不一致。
  • 通过延迟消息和超时检查机制,可以有效地应对支付失败或通知丢失等问题,确保系统的一致性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值