实战,SpringBoot + RabbitMQ死信队列实现超时关单

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

需求背景之为什么要有超时关单

原因一:

第三方支付平台的支付连接都是有时效性,创建订单后,需要在一定的时间内支付完成, 比如微信支付、支付宝支付等。当然也可以不关闭订单,做订单二次支付的操作,但业务链路会更加复杂,所以一般会直接关闭

原因二:

电商业务里面还会涉及到商品库存的锁定和释放

所以多数订单业务都是会有这个功能,那如何设计呢?

RabbitMQ死信队列-延迟消息知识点回顾

什么是RabbitMQ的死信队列

没有被及时消费的消息存放的队列

什么是rabbitmq的死信交换机

Dead Letter Exchange(死信交换机,缩写:DLX)当消息成为死信后,会被重新发送到另一个交换机,这个交换机就是DLX死信交换机

消息有哪几种情况成为死信

消费者拒收消息(basic.reject/ basic.nack),并且没有重新入队 requeue=false 消息在队列中未被消费,且超过队列或者消息本身的过期时间TTL(time-to-live) 队列的消息长度达到极限 结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列

什么是延迟队列

一种带有延迟功能的消息队列,Producer 将消息发送到消息队列 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到Consumer 进行消费,该消息即延时消息

业界的一些实现方式:

<
RabbitMQ学习笔记:RabbitMQ延迟队列(DLX、TTL及rabbitmq_delayed_message_exchange插件) 延迟队列存储的对象是对应的延迟消息,所谓的延迟消息是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。 延迟消息使用的场景有很多,比如: 在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行异常处理,这时候就可以使用延迟队列来处理这些订单了。 用户希望通过手机远程遥控家里的智能设备在指定... 阅读详情

相关推荐

解密RabbitMQ的七种消息模型:从电商场景看消息队列的实战应用

本文深入解析RabbitMQ的七种消息模型在电商高并发场景下的实战应用,涵盖Direct、Fanout、Topic等模型,结合SpringBoot实现订单处理、库存同步等核心功能。通过具体案例展示如何提升系统可用性至99.99%,解决秒杀、支付回调等业务痛点,为开发者提供高效消息队列解决方案。

weixin_29292431的博客 297

springboot结合rabbitmq实现订单超时自动关闭

springboot结合rabbitmq实现订单超时自动关闭

SpringBoot项目里RabbitMQ消息确认(ACK)的坑,我帮你踩完了

本文深入探讨了SpringBoot项目中RabbitMQ消息确认(ACK)机制的七个常见陷阱及解决方案,包括配置版本兼容、手动ACK处理、事务交互等关键问题。通过实战案例和性能数据,帮助开发者避免消息丢失和堆积,提升分布式系统的可靠性。

weixin_26833939的博客 147

RabbitMQ---延迟消息

主要分析RabbitMQ延迟消息的实现方式,延迟队列使用消息过期时间及死信队列实现,延迟消息插件较上面的方法更便捷

Mai_Jun_Hao的博客 8281

RabbitMQ实现消息队列延迟功能

实现延迟功能,一般使用RabbitMQ 的消息队列延迟功能,即采用官方提供的插件 “rabbitmq_delayed_message_exchange” 来实现。但RabbitMQ 版本必须是 3.5.8 以上才支持该插件,否则得用其“死信”功能。 1、安装RabbitMQ延迟插件 (1)检查插件 使用 rabbitmq-plugins list命令用于查看RabbitMQ安装的插件。 打开一个新的cmd窗口(按快捷键“Win+R”,输入“cmd”)。 运行命令:rabbitmq-plug...

pan_junbiao的博客 8435

RabbitMQ实现下单超时自动取消支付

用户下单,将订单存放到交换机ex.order(过期时间为下单超时时间30分钟),消息到q_order队列中,不设置该队列的消费者(故此消息一直未消费).,同时指定一个死信交换机ex.order.dlx,并绑定一个死信队列q.order.dlx,当消息超过30分钟过期变成死信时,该消就会被发送到该死信队列上,由死信消费者消费,判断订单id是否支付,如果未支付则修改为支付超时订单过期。声明订单死信队列和交换机,并绑定,(订单消息过期时间这里为了方便测试,设置为10s)观察订单信息进入到订单队列。

零一的博客 6948

使用RabbitMQ死信队列关闭未支付的订单

RabbitMQ死信队列(Dead-Letter Exchange,简称DLX)是一种特殊类型的交换机,用于处理在队列中无法被消费的消息。当消息无法被消费时,它会被转发到死信队列中,以便进一步处理。消息无法被消费者处理:例如,如果消费者崩溃或消息的格式不正确,则无法处理消息。此时,消息将被发送到死信队列进行进一步处理。消息的优先级较低:如果消息的优先级较低,则可能无法在队列中得到及时处理。在这种情况下,消息也会被发送到死信队列中,以确保它最终被处理。

lovoo的博客 3211

SpringBoot系列12:整合RabbitMQ消息队列,异步解耦、死信队列完整业务案例

本文介绍了SpringBoot整合RabbitMQ实战指南,包含核心概念、生产级配置、四大交换机场景实现以及可靠性保障方案。主要内容包括: RabbitMQ核心价值:异步解耦、流量削峰、事件驱动、延时任务四大生产场景 核心组件详解:生产者、消费者、交换机、队列等概念 SpringBoot生产级配置:持久化、确认机制、重试策略、序列化优化 四大交换机实战:Direct直连、Topic主题、Fanout广播、Headers匹配 消息可靠性方案:确认机制、退回机制、持久化、消费者重试 生产避坑指南:重复消费、消

深耕 Java 后端与企业级软件架构设计,专注微服务、分布式系统、大模型 AI 应用架构落地。 319

D6_基本结构(D4_队列(D3_死信队列))

最后,咱们再来回顾总结一下利用死信队列实现延迟关单的流程:1、订单消息通过OrderMessageSender发送到延迟队列。2、延迟时间过后,订单消息被投递到死信队列。3、OrderMessageReceiver监听死信队列,一旦有消息到达,调用OrderService的closeOrder方法执行关单操作。这种延迟关单功能还可以用于定时任务、订单超时处理等场景。

思维码途 1500

Springboot使用RabbitMQ实现关闭超时订单的一个简单示例

order.delay.queue队列通过路由键order.create.order绑定到order-event-exchange交换机,order.release.order.queue队列通过路由键order.release.order也绑定到order-event-exchange交换机。使用rabbitTemplate将订单数据通过交换机order-event-exchange和路由键order.create.order将订单数据order发送给队列order.delay.queue。

shenxiaomo1688的博客 719

SpringBoot系列】最详细demo-- 怎么不用定时任务实现关闭订单

在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;那他们是怎么实现的呢?定时任务关闭订单rocketmq延迟队列rabbitmq死信队列时间轮算法redis过期监听。...

wufaqidong1的博客 686

领导:谁再用定时任务实现关闭订单,立马滚蛋!

在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;那他们是怎么实现的呢?一般的做法有如下几种:定时任务关闭订单rocketmq延迟队列rabbitmq死信队列时间轮算法redis过期监听一、定时任务关闭订单(最low)一般情况下,最不推荐的方式...

MarkerHub的博客 316

java】【springboot】队列涉及订单关闭数据返还异常

一、什么是RabbitMQ死信队列RabbitMQ死信队列(Dead-Letter Exchange,简称DLX)是一种特殊类型的交换机,用于处理在队列中无法被消费的消息。当消息无法被消费时,它会被转发到死信队列中,以便进一步处理。在RabbitMQ中,死信队列通常用于处理以下情况:消息无法被消费者处理:例如,如果消费者崩溃或消息的格式不正确,则无法处理消息。此时,消息将被发送到死信队列进行进一步处理。消息的优先级较低:如果消息的优先级较低,则可能无法在队列中得到及时处理。

qq_27246521的博客 103

面试官:怎么不用定时任务实现关闭订单

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 11 分钟。来自:juejin.cn/post/6987233263660040206在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;那他们是怎么实现的呢?一般的做法有如下...

良月柒 282

11种方案,实现订单到期关闭

???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

芋艿V 342

使用Spring Boot整合Rabbit MQ实现延时队列定时关闭无效订单

一、业务场景 下订单后,30分组内没用付款就要关闭订单等一些需要延时执行的任务。使用定时任务轮询数据库则浪费太多资源 二、环境搭建 1.Rabbit MQ 这里我使用docker安装Rabbit MQ docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management (PS:Rabbit MQ各个端口的作用)

weixin_44898959的博客 811

领导:谁再用 Redis 实现过期订单关闭,立马滚蛋!

虽然我们可以配合数据库的持久化一起使用。但是,死信队列实现方式存在一个问题,那就是可能造成队头阻塞,因为队列是先进先出的,而且每次只会判断队头的消息是否过期,那么,如果队头的消息时间很长,一直都不过期,那么就会阻塞整个队列,这时候即使排在他后面的消息过期了,那么也会被一直阻塞。基于延迟队列,是可以实现订单的延迟关闭的,首先,在用户创建订单的时候,把订单加入到DelayQueue中,然后,还需要一个常驻任务不断的从队列中取出那些到了超时时间的订单,然后在把他们进行关单,之后再从队列中删除掉。

竹林幽深 224

谷粒商城中消息队列的使用

订单服务中使用到了消息队列 具体就是解决关单还有自动解锁库存的功能其实就是使用消息队列的延迟队列的功能 达到一个定时任务的作用使用消息队列到达最终一致性的效果比如说库存 当下单之后 执行锁库存的远程方法如果说下订单的那个方法,在锁库存之后出现了异常,那么这个下订单的方法会回滚,但是这个锁库存的远程方法,已经锁定,就不能够再回滚了。这样就会造成订单没有下成,但是库存却锁定了使用消息队列解决多服务下面的数据不一致的问题,通过最终一致性解决。

m0_63445035的博客 382
上一篇: JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明
下一篇: Redis分布式锁升级:RedLock+SpringBoot
Java佳佳
博客等级 码龄4年 216粉丝 · 286原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值