您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

RabbitMQ延迟队列、重试队列和死信队列

时间:2023-04-27 13:43:59  来源:今日头条  作者:知其然亦知其所以然
假设我们有一个电商项目,其中涉及到订单的处理。在订单支付后,我们需要发送订单消息到 RabbitMQ 进行异步处理。为了处理可能出现的处理失败情况,我们可以使用延迟队列、重试队列和死信队列来保证订单消息的可靠处理。

大家好,我是小米,一个热衷于技术分享的程序员。昨天,有一位童鞋在 QQ 群里向我请教了一个问题:“一个延迟队列绑定了死信队列和重试机制的重试队列,那消息会进入到死信队列还是重试后进入重试队列呢?”在这篇文章中,我将为大家详细解答这个问题,并介绍延迟队列、重试队列、死信队列这三种常见的消息处理队列,以及如何在 RabbitMQ 中实现它们。

消息的处理流程

首先,让我们来看一下消息的处理流程。当消息发送到延迟队列时,根据设置的延迟时间进行等待。等待时间过后,如果消息未被消费者消费,则会进入绑定的死信队列。如果消费者消费了消息,但消息处理失败,消息会被发送到绑定的重试队列,进行重试操作。如果在重试队列中仍然无法处理成功,消息最终会被发送到死信队列。这种处理流程可以有效地处理消息处理失败的情况,确保消息能够被正确处理。

延迟队列、重试队列、死信队列的区别

延迟队列是指将消息延迟一段时间后再投递给消费者的队列。它通常用于处理需要延迟处理的业务场景,例如订单超时未支付、秒杀活动结束后未支付的订单等。延迟队列通过设置消息的过期时间来实现延迟投递。

重试队列是指在消息处理失败后,将消息重新投递给消费者进行重试的队列。它通常用于处理消息处理失败的情况,例如网络异常、业务处理失败等。重试队列可以设置最大重试次数和重试间隔,确保消息在处理失败时可以进行自动重试,提高消息的处理成功率。

死信队列是指无法被消费者成功处理的消息最终被投递到的队列。它通常用于处理无法处理的消息,例如消息处理失败达到最大重试次数、消息过期等。死信队列可以用来记录无法处理的消息,并进行相应的处理操作,例如记录日志、发送告警等。

如何实现延迟队列、重试队列、死信队列

在 RabbitMQ 中,延迟队列、重试队列、死信队列可以通过以下方式实现:

  • 延迟队列:在RabbitMQ中,可以使用RabbitMQ的插件 rabbitmq_delayed_message_exchange 来实现延迟队列。这个插件可以让我们在声明交换器时指定一个延迟时间,在消息发送到交换器后,会根据设置的延迟时间进行等待,等待时间过后,消息会被发送到绑定的目标队列进行消费。这样就实现了延迟队列的功能。
  • 重试队列: 在 RabbitMQ 中,可以通过设置消息的TTL(Time To Live)属性来实现重试队列。当消息在目标队列中消费失败时,可以将消息重新发送到绑定的重试队列,并设置一定的TTL,即重试的时间间隔。如果消息在重试队列中未被消费成功,则会再次被发送到重试队列,直到达到设置的重试次数。如果重试次数达到上限,消息会被丢弃或者发送到死信队列。
  • 死信队列: 在 RabbitMQ 中,可以通过设置队列的属性和使用DLX(Dead Letter Exchange)来实现死信队列。当消息在目标队列中因为某些原因无法被消费时,可以将消息发送到绑定的死信队列中。在声明队列时,可以设置队列的 x-dead-letter-exchange 和 x-dead-letter-routing-key 属性来指定死信队列的交换器和路由键。当消息成为死信后,会被发送到指定的死信队列中。

电商项目实际案例

假设我们有一个电商项目,其中涉及到订单的处理。在订单支付后,我们需要发送订单消息到 RabbitMQ 进行异步处理。为了处理可能出现的处理失败情况,我们可以使用延迟队列、重试队列和死信队列来保证订单消息的可靠处理。

首先,我们可以创建一个延迟队列,设置订单消息的过期时间为30分钟,并将该队列绑定到一个延迟交换机上。订单消息会在30分钟后自动投递到绑定的队列。

如果订单消息在延迟队列中未被消费者消费,那么会被投递到绑定的死信交换机,并路由到死信队列。在死信队列中,我们可以记录日志,发送告警,或者进行其他的处理操作。

如果消费者消费了订单消息,但处理失败,我们可以将消息重新发送到一个专门用于重试的队列,设置最大重试次数为3次,重试间隔为5分钟。在重试队列中,消费者会尝试处理消息,并进行最多3次的重试。如果仍然无法处理成功,则消息会被投递到绑定的死信交换机,并路由到死信队列。

通过以上的处理机制,我们可以保证订单消息在处理失败时能够进行重试,并最终投递到死信队列进行处理。这样可以有效地处理订单消息处理失败的情况,确保订单消息的可靠处理。

以下是一个简单的 JAVA 代码演示如何在 RabbitMQ 中实现延迟队列、重试队列和死信队列的功能:

通过上述代码,我们可以看到延迟队列、重试队列和死信队列在实际应用中的使用方式。延迟队列用于设置消息的延迟处理时间,重试队列用于处理消息处理失败后的重试操作,死信队列用于处理无法成功处理的消息。

END

  • 延迟队列通过设置消息的过期时间来实现延迟处理,将消息发送到一个特定的交换机,并设置延迟时间作为消息的过期时间。当消息在延迟队列中等待的时间超过设定的延迟时间时,消息会自动转发到绑定的死信交换机,从而进入死信队列。
  • 重试队列通过设置消息的最大重试次数来实现消息的重试操作,将消息发送到一个特定的交换机,并在消息的 headers 中设置最大重试次数。当消息在重试队列中被消费者消费但处理失败时,会根据设置的最大重试次数将消息重新发送到重试队列,直到达到最大重试次数后,消息会被发送到死信交换机,从而进入死信队列。
  • 死信队列通过将无法成功处理的消息发送到一个特定的交换机来实现。当消息在队列中发生死信情况时,如消息过期或重试次数超过最大重试次数等,消息会自动转发到绑定的死信交换机,并进入死信队列。

以上是延迟队列、重试队列和死信队列的简单介绍和实际应用案例,通过合理使用这三种队列,我们可以有效地处理消息的延迟处理、消息处理失败的重试以及无法成功处理的消息,从而提升系统的可靠性和稳定性。

希望本文对大家在使用 RabbitMQ 时有所帮助!欢迎关注我的微信公众号“知其然亦知其所以然”!

参考文献

  • RabbitMQ官方文档:https://www.rabbitmq.com/
  • RabbitMQ in Depth:Gavin M. Roy
  • Mastering RabbitMQ:Simon M. Pleasant
  • RabbitMQ Cookbook: Sigismondo Boschi
  • RabbitMQ中文文档:https://rabbitmq.mr-ping.com/


Tags:RabbitMQ   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
假设我们有一个电商项目,其中涉及到订单的处理。在订单支付后,我们需要发送订单消息到 RabbitMQ 进行异步处理。为了处理可能出现的处理失败情况,我们可以使用延迟队列、重试队...【详细内容】
2023-04-27  Tags: RabbitMQ  点击:(0)  评论:(0)  加入收藏
Spring Boot 是一个基于 Spring 框架的快速开发框架,而 RabbitMQ 和 RocketMQ 则是常用的消息队列中间件。下面是它们常用的一些用法和场景。 订单处理在电商等系统中,下单后...【详细内容】
2023-03-09  Tags: RabbitMQ  点击:(46)  评论:(0)  加入收藏
准备工作纯Java项目依赖创建一个maven-java项目在pom.xml中添加以下依赖:com.RabbitMQ:amqp-client:5.15.0org.projectlombok:lombok:1.18.24junit:junit:4.13.2org.apache.l...【详细内容】
2022-09-24  Tags: RabbitMQ  点击:(98)  评论:(0)  加入收藏
环境搭建// maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId>...【详细内容】
2022-09-07  Tags: RabbitMQ  点击:(125)  评论:(0)  加入收藏
同步通讯发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式同步调用的时效性强,可以立即获取结果同步调用的问题我们以前在使用Feign或OpenFeign时,就是使用的...【详细内容】
2022-08-26  Tags: RabbitMQ  点击:(159)  评论:(0)  加入收藏
整体阅读时间,在 40 分钟左右。常见的消息队列很多,主要包括 RabbitMQ、Kafka、RocketMQ 和 ActiveMQ,相关的选型可以看我之前的系列,这篇文章只讲 RabbitMQ,先讲原理,后搞实战。...【详细内容】
2022-08-19  Tags: RabbitMQ  点击:(165)  评论:(0)  加入收藏
大量业务使用消息中间件进行系统间的解耦、异步化、削峰填谷设计实现。公司内部前期基于RabbitMQ实现了一套高可用的消息中间件平台。随着业务的持续增长,消息体量随之增大,对...【详细内容】
2022-07-28  Tags: RabbitMQ  点击:(161)  评论:(0)  加入收藏
1、RabbitMQ依赖于Erlang,需要先安装Erlang2、Erlang和RabbitMQ版本有对应关系http://www.rabbitmq.com/which-erlang.html2.3安装Erlang21.3先安装一些必要的依赖:yum -y ins...【详细内容】
2022-07-11  Tags: RabbitMQ  点击:(143)  评论:(0)  加入收藏
三个优点分别是:解耦、异步、削峰。一、解耦1.普通实现方式(商务系统) 对应的伪代码如下:支付(){ 支付逻辑... 扣除商品库存(); 修改订单状态();}2.MQ实现方式 对应的...【详细内容】
2022-06-26  Tags: RabbitMQ  点击:(203)  评论:(0)  加入收藏
背景 普通消息队列,消息一旦入队就会被消费者立刻消费,而延迟队列则需要指定固定时间后被延迟消费.docker安装rabbitMq延迟队列插件版本学习的话可以去官网下载rabbitmq并通...【详细内容】
2022-04-29  Tags: RabbitMQ  点击:(192)  评论:(0)  加入收藏
▌简易百科推荐
假设我们有一个电商项目,其中涉及到订单的处理。在订单支付后,我们需要发送订单消息到 RabbitMQ 进行异步处理。为了处理可能出现的处理失败情况,我们可以使用延迟队列、重试队...【详细内容】
2023-04-27  知其然亦知其所以然  今日头条  Tags:RabbitMQ   点击:(0)  评论:(0)  加入收藏
一、一级缓存1、在⼀个sqlSession中,对User表根据id进行两次查询,查看他们发出sql语句的情况。2、同样是对user表进⾏两次查询,只不过两次查询之间进⾏了⼀次update操作。3、总...【详细内容】
2023-04-27  日拱一卒程序猿  今日头条  Tags:MyBatis   点击:(0)  评论:(0)  加入收藏
1 为什么要做接口防刷?如果你的服务器应用,被一些人而已攻击,写入脚本不停的刷服务端的某一个接口,这样服务端的压力聚会非常的,甚至可能给服务端带来灾难,如果是涉及支付相关的...【详细内容】
2023-04-24  程序猿怪咖    Tags:SpringBoot   点击:(4)  评论:(0)  加入收藏
这段代码展示了如何通过Java配置类的方式来配置MyBatis框架,其中涉及到数据源的配置、SqlSessionFactory的创建、SqlSessionTemplate的创建以及事务管理器的创建。@MapperSca...【详细内容】
2023-04-23  豆ok  今日头条  Tags:MyBatis   点击:(9)  评论:(0)  加入收藏
受益于开源技术的发展,以及响应快速开发的实际业务需求,跨平台开发不仅限于移动端跨平台,桌面端虽然在市场应用方面场景不像移动端那么丰富,但也有市场的需求。相对于个人开发者...【详细内容】
2023-04-19  艾特程序员  搜狐号  Tags:框架   点击:(11)  评论:(0)  加入收藏
抖音开源了一个前端UI框架-Semi-UI,还是不错的。大家可以了解下哈,等成熟了,可以用用。Semi-UI,现代、全面、灵活的设计系统和 UI 库。快速搭建美观的React 应用。github开源地...【详细内容】
2023-04-18  Meta     Tags:UI框架   点击:(18)  评论:(0)  加入收藏
Mor (发音为 /mɔːr/,类似 more) 是饿了么开发的一款基于小程序 DSL 的,可扩展的多端研发框架。...【详细内容】
2023-04-18    CSDN  Tags: MorJS   点击:(23)  评论:(0)  加入收藏
项目介绍一款基于开源框架实现的脚手架平台,帮助中小企业快速迭代开发。项目特点项目架构项目架构项目功能 会员管理 文档管理 菜单管理 用户管理 角色管理 系统日志 接口ap...【详细内容】
2023-04-17  睿智的仁杰  今日头条  Tags:脚手架   点击:(20)  评论:(0)  加入收藏
在 MyBatis 中,可以使用${}或#{}来拼接 SQL 语句中的参数。在进行模糊查询时,需要使用通配符 % 表示任意字符,具体写法如下: 使用${}:<select id="selectUsersByName" resultTyp...【详细内容】
2023-04-16      Tags:MyBatis   点击:(15)  评论:(0)  加入收藏
今天要聊的就是「博客管理」中全文搜索的实现,基于 SpringBoot+Vue+ES 实现,先给大家看一下效果: 全文搜索+关键字高亮,是不是和百度的效果差不多,话不多说,直接聊如何实现。 该...【详细内容】
2023-04-15  会踢球的程序源  今日头条  Tags:SpringBoot   点击:(18)  评论:(0)  加入收藏
站内最新
站内热门
站内头条