RabbitMQ深度探索:死信队列

embedded/2025/2/8 20:33:41/
  1. 死信队列产生背景:
    1. RabbitMQ 死信队列俗称 备胎队列:消息中间件因为某种原因拒收该消息后,可以转移到私信队列中存放,死信队列也可以有交换机和路由 key 等
  2. 生产死信队列的原因:
    1. 消息投递到 MQ 存放,消息已经过期,消费者没有及时获取到我们的消息,消息如果存放到 MQ 服务器中过期之后,会转移到备胎死信队列存放
    2. 多列达到最大长度(队列已满)
    3. 消费者消费多次消息失败,就会转义到私信队列中
  3. 案例:
    1. 配置类:
      @Component
      public class DeadExchangeConfig {//普通交换机@Value("${boyatop.order.exchange}")private  String order_exchange;//普通队列@Value("${boyatop.order.queue}")private String order_queue;//普通队列的 key@Value("${boyatop.order.routingKey}")private String order_rotingKey;//死信交换机@Value("${boyatop.dlx.exchange}")private String dlx_exchange;//死信队列@Value("${boyatop.dlx.queue}")private String dlx_queue;//死信队列的 key@Value("${boyatop.dlx.routingKey}")private String dlx_routingKey;//定义死信交换机@Beanpublic DirectExchange dlxExchange(){return new DirectExchange(dlx_exchange);}//定义死信队列@Beanpublic Queue dlxQueue(){return new Queue(dlx_queue);}//定义普通交换机@Beanpublic DirectExchange orderExchange(){return new DirectExchange(order_exchange);}//定义普通队列@Beanpublic Queue orderQueue(){//订单队列绑定死信交换机Map<String,Object> arguments = new HashMap<>(2);arguments.put("x-dead-letter-exchange",dlx_exchange);arguments.put("x-dead-letter-routing-key",dlx_routingKey);return new Queue(order_queue,true,false,false,arguments);
      //        return QueueBuilder.durable(order_queue).withArguments(arguments).build();}//订单队列绑定交换机@Beanpublic Binding bindingOrderExchange(DirectExchange orderExchange, Queue orderQueue){return BindingBuilder.bind(orderQueue).to(orderExchange).with(order_rotingKey);}//死信队列绑定交换机@Beanpublic Binding bindingDlxExchange(DirectExchange dlxExchange, Queue dlxQueue){return BindingBuilder.bind(dlxQueue).to(dlxExchange).with(dlx_routingKey);}}
    2. 生产者:
      @RestController
      public class producerService {@Value("${boyatop.order.exchange}")private String orderExchange;@Value("${boyatop.order.routingKey}")private String orderRouTingKey;@AutowiredRabbitTemplate rabbitTemplate;@RequestMapping("/sendMsg")public String send(){String msg = "11111";rabbitTemplate.convertAndSend(orderExchange,orderRouTingKey,msg,message -> {//设置超时时间message.getMessageProperties().setExpiration("5000");return message;});return "success";}}
    3. yml 文件:
      spring:rabbitmq:####连接地址host: 127.0.0.1####端口号port: 5672####账号username: guest####密码password: guest### 地址virtual-host: boyatopVirtualHost#演示死信队列
      boyatop:#备胎交换机dlx:exchange: boyatop_dlx_exchangequeue: boyatop_dlx_queueroutingKey: dlx#普通交换机order:exchange: boyatop_order_exchangequeue: boyatop_order_queueroutingKey: order
  4. 死信队列架构原理:
    1. 死信队列和普通队列区别不是很大
    2. 普通队列和死信队列都有自己独立的交换机、路由 key、队列和消费者
    3. 区别:
      1. 生产者投递消息先投递到普通交换机中,普通交换机再将该消息投到普通队列中缓存起来,普通队列对应有自己独立的消费者
      2. 如果生产者投递消息到普通队列中,普通队列发现该消息一直没有被消费者消费的情况下,这时候会将该消息转移到死信(备胎)交换机中
      3. 死信(备胎)交换机对应有自己独立的死信(备胎)队列,对应独立的死信(备胎)消费者
  5. 死信队列应用场景:
    1. 30 分钟订单超时设计
      1. redis 过期 key
      2. 死信延迟队列实现
    2. 采用死信队列,创建一个普通队列没有对应的消费者消费该消息,在 30 分钟过后就会将该消息转移到死信备胎消费者实现消费
    3. 死信备胎消费者会根据订单号码查询是否已经支付过,如果没有支付的情况下则会开始回滚库存操作

http://www.ppmy.cn/embedded/160616.html

相关文章

通信易懂唠唠SOME/IP——SOME/IP消息格式

SOME/IP是Scalable service-Oriented MiddlewarE over IP (SOME/IP)的缩写&#xff0c;基于IP的可扩展面向服务的中间件。广泛应用于汽车行业嵌入式通信。 它是基于服务的&#xff0c;服务可以由0个或多个Event,Method,Field组成。 Event是一种单向的数据传输&#xff0c;在数…

【R】Dijkstra算法求最短路径

使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data&#xff0c;存放有向图信息 data中每个点所在的行序号为起始点序号&#xff0c;列为终点序号。 比如&#xff1a;值4的坐标为(1,2)即点1到点2距离为4&#xff1b;值8的坐标为(6,7)…

RabbitMQ 与 Kafka 的核心区别,如何选择合适的消息中间件?

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff0c;MQ&#xff09;扮演着重要角色&#xff0c;能够解耦服务、提高系统伸缩性、增强可靠性。目前&#xff0c;RabbitMQ 和 Kafka 是两款最常见的消息中间件&#xff0c;它们虽然都能实现消息传输&…

elasticsearch(ES)简介及安装-----笔记

elasticsearch简介 ES是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 ES结合kibana、Logstash、Beats&#xff0c;也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域。 elasticsearch是elastic stack的核心&…

【Elasticsearch】geotile grid聚合

geotile_grid聚合是 Elasticsearch 中一种用于处理地理数据的多桶聚合方式&#xff0c;它将geo_point和geo_shape类型的值分组到表示网格的桶中。以下是关于geotile_grid聚合的详细说明&#xff1a; 基本概念 • 网格划分&#xff1a;geotile_grid聚合将地理数据划分为一个稀疏…

【mysql】数据库字段设计原则

本文将分享17个关键字段设计原则&#xff0c;这些经验可规避80%的数据库设计缺陷&#xff0c;涵盖性能、扩展性、可维护性等核心维度&#xff0c;附具体场景示例&#xff1a; 一、数据类型选择&#xff1a;避免“隐形成本杀手” 1. 整数类型精确匹配 坑&#xff1a;滥用BIGIN…

Llama最新开源大模型Llama3.1

Meta公司于2024年7月23日发布了最新的开源大模型Llama 3.1&#xff0c;这是其在大语言模型领域的重要进展。以下是关于Llama 3.1的详细介绍&#xff1a; 参数规模与训练数据 Llama 3.1拥有4050亿&#xff08;405B&#xff09;参数&#xff0c;是目前开源领域中参数规模最大的…

为多个GitHub账户配置SSH密钥

背景 当需要同时使用多个GitHub账户&#xff08;例如工作和个人账户&#xff09;时&#xff0c;默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对&#xff0c;并指…