【个人笔记】mq超时取消订单

对下单场景可能遇到的一些问题的思考
下单过程:请求-> 下单 + 锁库存->支付

1. 场景一:下单 + 锁库存(如何提高响应速度)

不要求响应速度:先加锁(保证线程安全),判断库存是否足够,足够的话库存-1,再创建订单,订单初始化为待支付状态,然后返回处理结果。
优化思路:只要创建订单,就要频繁操作数据库 IO。可以通过预扣库存来避免直接操作数据库 IO,即用redis统一存库存(redis号称单机 QPS 能抗 10W 的并发),下单过程变为:请求----redis减库存----在mysql减库存+创建订单----支付
具体优化方案:预扣库存(用mq+redis进行优化),目的是提高响应速度。redis存放库存数量,先在redis判断库存是否足够,足够的话库存-1并返回处理结果,并发送消息到MQ的消息队列中,通过消费者异步在数据库减库存并创建订单,这样响应给用户的速度就会快很多(预扣完库存就能返回响应)。生成订单时,订单状态初始化为待支付。
在这里插入图片描述

2. 场景二:支付(如何保证不少卖和强一致性)

注意:调用第三方支付的话,第三方会提供回调通知,服务端通过第三方的回调通知,可以知道第三方订单的状态,从而决定是否订单过期。
(1)用户下单后,一直不支付怎么办?(怎么保证不少卖)
为了防止用户下单后既不取消也不付款,导致库存一直被锁定,卖不出去,设置五分钟的过期时间,用户五分钟内不支付,就设置订单为取消状态,并释放库存(加锁使库存+1)。
如果订单量不大,用定时任务比如spring task或者分布式定时任务xxl-job去定时扫表就行了,但有个问题就是,每个订单的下单时间不一样,而定时任务是一次性扫描整表,如果定时时间设置短一点,30s查一次,太频繁了,表里数据量大的话,更耗性能。如果设置长一点5分钟查一次,那又会处理不及时。
所以需要考虑用mq延时队列,每创建一个支付订单都要放到延时队列,超时就去数据库查询有没有支付成功,没有就取消订单(设置状态为已取消),性能问题好说,比如增加消费者数量以加快处理速度,再比如增加数据库集群数量,来解决数据库性能不足的问题。
(2)用户下单后,支付了已取消的订单怎么办?(怎么保证强一致性)
为了防止用户卡在取消订单前跳转到支付页面进行支付导致的订单被取消而用户支付成功的问题,可以在取消订单的同时也取消支付接口(第三方支付的接口也是可以取消的!),取消之后用户就会付款失败,万一用户真的支付成功了,就等第三方支付成功的回调,返回回调的话就对已经取消的订单走退款,从而保证资金的幂等。
这里还可以有一种设置,就是设置5分钟超时后,mq只是去检验哪些订单超时了,设置订单为取消状态并且取消支付接口,再等1分钟之后(而不是马上)才会去释放库存(库存+1),如果这一分钟里面如果能接到支付成功的回调,就重新设置订单为支付成功。当然如果回调也超时那就得退款了(最后订单还是取消了)。

其他:像商品那种库存比较多的,可以设置只有库存低了才去预防超卖,或者只放出70%的库存,留一定的余量防止超卖,或者超卖后店家直接补一批货发出去得了,但像预约数量那种场景就没必要设置只有库存低了才去预防超卖,因为预约数本来就不多

<think>好的,我现在需要帮助用户找到关于RabbitMQ高级用法的学习笔记或教程,特别是来自黑马程序员的资料。首先,我要查看用户提供的引用内容,看看是否有相关的资料。 用户提供了四个引用,其中引用[1]、[2]、[3]、[4]都提到了RabbitMQ的内容。引用[1]详细列出了RabbitMQ的高级特性,如消息可靠性投递、Consumer ACK、消费端限流、TTL、死信队列、延迟队列等,这应该是用户需要的高级用法内容。引用[2]和引用[4]提到了安装和配置RabbitMQ的步骤,包括配置MQ地址、端口、虚拟主机等,这可能属于基础配置,但也是高级用法的基础。引用[3]和引用[4]都有关于Spring配置RabbitMQ的信息,这对于整合到应用中很重要。 用户的问题明确提到“高级用法”,所以需要重点突出引用[1]中的内容,比如消息可靠投递、死信队列、延迟队列等。同时,用户可能也需要了解如何配置环境,所以引用中的配置信息也需要提及。另外,用户提到了黑马程序员的笔记,所以需要确认引用中的资料是否来自黑马。引用[1]、[2]、[4]都明确提到了黑马,因此这些内容符合用户需求。 接下来,需要组织回答结构,先介绍找到的相关资料,然后分点详细说明高级特性,每个特性简要解释,并引用对应的引用来源。此外,用户可能需要知道如何获取这些资料,引用[2]提到了安装教程的网盘链接,但用户可能无法直接访问,所以需要提示用户可能需要自行查找或联系分享者。 最后,按照用户的要求生成相关问题,这些问题应围绕高级特性的应用、配置、区别等方面展开,帮助用户深入理解。 需要确保回答符合系统级指令,使用正确的中文和LaTeX格式,但根据用户的问题,可能数学公式较少,但如果有涉及性能分析的部分,可能需要用LaTeX表达,例如消息投递成功率公式:$P = 1 - p^n$。不过当前引用内容中没有涉及数学公式,所以可能不需要使用。但根据系统指令,所有行内数学表达式必须使用$...$,需要检查是否有必要添加,但用户的问题主要关于RabbitMQ,可能不涉及数学,因此可能不需要。 总结回答结构: 1. 确认找到黑马程序员的RabbitMQ高级学习笔记。 2. 分点介绍高级特性,每个特性后添加引用标记。 3. 提到相关配置和安装教程,引用对应的来源。 4. 提供相关问题供用户进一步学习。</think>根据您提供的信息,我为您整理了黑马程序员RabbitMQ高级学习笔记的核心内容: ### 一、RabbitMQ高级特性 1. **消息可靠性投递** - 通过生产者确认机制实现,包含事务模式和Confirm模式(异步回调),确保消息成功到达Broker[^1] - 消息补偿机制公式:$消息成功率 = 1 - 失败概率^n$(n为最大重试次数) 2. **Consumer ACK机制** ```java // 消费者手动确认示例 channel.basicAck(deliveryTag, false); // 成功确认 channel.basicNack(deliveryTag, false, true); // 失败重入队列 ``` 3. **消费端限流** ```yaml # 配置预取数量(QoS) spring: rabbitmq: listener: simple: prefetch: 5 # 每次最多处理5条[^1] ``` 4. **TTL与死信队列** ```properties # 队列设置消息过期时间 x-message-ttl=60000 # 单位毫秒[^1] ``` 5. **延迟队列实现** - 通过死信队列+TTL组合实现延时效果 - 应用场景:订单超时关闭、定时任务调度等[^1] ### 二、环境配置要点 1. **基础连接配置** ```yaml spring: rabbitmq: host: 192.168.150.101 port: 5672 virtual-host: /hmall username: hmall password: 123[^3] ``` 2. **集群配置** ```yaml addresses: 192.168.1.101:5672,192.168.1.102:5672 # 多节点配置[^4] ``` ### 三、配套学习资源 1. 安装教程(含虚拟机镜像)[^2] 2. 消息追踪工具使用:Firehose跟踪消息流向 3. 管理控制台监控:消息积压监控、通道状态查看等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值