场景:一个订单在11:00超时关闭,但在11:00支付成功

来自hollis

情况分析

有两种情况

订单支付成功,关闭失败(合理的)

订单关闭失败,支付成功(不合理的)

主要思考第二种情况如何解决

失败退款

使用乐观锁,更新的时候查看订单状态

如果订单状态不对,进行退款流程

即便是退款的时候也要考虑到退款失败的问题

资金恒等式

在订单表中增加更多配置

支付金额、退款金额

支付金额-退款金额 = 0才是合理的状态

定时任务不断去轮询订单表,查看退款失败的订单,进行再次退款

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用 RabbitMQ 的死信队列处理订单超时支付的示例程序。 首先,我们需要创建一个普通队列,用于存放订单消息。这个队列需要设置消息的 TTL(生存时间),超时支付订单消息会被自动转发到死信队列中。还需要设置 DLX(死信交换机)和 DLK(死信路由键),用于指定转发到哪个死信队列中。 ```python import pika # 连接 RabbitMQ 服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 创建普通队列,设置消息 TTL 和死信交换机/路由键 channel.queue_declare(queue='orders', arguments={ 'x-message-ttl': 60000, # 消息 TTL 为 60 秒 'x-dead-letter-exchange': 'dlx', # 指定死信交换机 'x-dead-letter-routing-key': 'dlx.orders' # 指定死信路由键 }) ``` 接下来,我们需要创建一个死信队列,用于接收转发过来的超时支付订单消息。 ```python # 创建死信队列 channel.queue_declare(queue='dlx.orders') # 创建死信交换机 channel.exchange_declare(exchange='dlx', exchange_type='direct') # 绑定死信队列和死信交换机 channel.queue_bind(queue='dlx.orders', exchange='dlx', routing_key='dlx.orders') ``` 最后,我们可以编写一个函数来模拟订单超时支付场景。该函数会将订单消息发送到普通队列中,等待超时后自动转发到死信队列中。我们可以使用 `time.sleep()` 函数来模拟订单超时的时间。 ```python import time def create_order(order_id): # 将订单消息发送到普通队列中 channel.basic_publish(exchange='', routing_key='orders', body=order_id) print(f'订单 {order_id} 已创建') # 模拟订单超时支付 time.sleep(70) # 订单超时后会自动转发到死信队列中 ``` 完整的示例代码如下: ```python import pika import time # 连接 RabbitMQ 服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 创建普通队列,设置消息 TTL 和死信交换机/路由键 channel.queue_declare(queue='orders', arguments={ 'x-message-ttl': 60000, # 消息 TTL 为 60 秒 'x-dead-letter-exchange': 'dlx', # 指定死信交换机 'x-dead-letter-routing-key': 'dlx.orders' # 指定死信路由键 }) # 创建死信队列 channel.queue_declare(queue='dlx.orders') # 创建死信交换机 channel.exchange_declare(exchange='dlx', exchange_type='direct') # 绑定死信队列和死信交换机 channel.queue_bind(queue='dlx.orders', exchange='dlx', routing_key='dlx.orders') def create_order(order_id): # 将订单消息发送到普通队列中 channel.basic_publish(exchange='', routing_key='orders', body=order_id) print(f'订单 {order_id} 已创建') # 模拟订单超时支付 time.sleep(70) # 订单超时后会自动转发到死信队列中 # 创建几个订单并测试 create_order('1001') create_order('1002') create_order('1003') # 关闭连接 connection.close() ``` 当订单超时支付时,程序会将订单消息自动转发到死信队列中。我们可以编写一个消费者程序来处理死信队列中的订单消息。 ```python import pika # 连接 RabbitMQ 服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 定义死信队列的消息处理函数 def handle_order(channel, method, properties, body): print(f'订单 {body} 已超时支付,自动转发到死信队列中') channel.basic_ack(delivery_tag=method.delivery_tag) # 订阅死信队列,处理订单消息 channel.basic_qos(prefetch_count=1) channel.basic_consume(queue='dlx.orders', on_message_callback=handle_order) channel.start_consuming() ``` 这样,我们就完成了使用 RabbitMQ 的死信队列处理订单超时支付的示例程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值