死信队列和异常消息队列区别

 

死信队列:由于某种原因无法传递的消息都放置在死信队列上,主要触发点(MCA 如果远程消息不能交付,MCA 发送的消息不能进行数据转换,Trigger Monitor 出发消息失败)。

回退队列:在外部应用在消费队列中消息时,如果发生异常,会发送回滚命令,回滚后的消息始终会放在队列的顶部,不断被处理和回滚,导致队陷入死循环状态,为了解决这个问题,MQ提供一种机制,选中队列右键--》属性--》存储器,设置回退队列和阀值,如设置队列为q1,阀值为2,则在rollback两次后将消息转入q1。

 

两者都为消息的可靠传输提供一种机制来处理异常。

 

两者的区别:

1. 起作用的阶段,死信队列主要在发送阶段,回退队列主要在消息的消费阶段生成。

2. 死信队列由系统触发, 回退队列主要由应用发送rollback触发。

3. 死信队列一个队列管理器只有一个,而回退队列可以为每个队列设置一个。

 

### 队列与消息队列区别 #### 1. 队列 队列是一种基本的数据结构,遵循先进先出(FIFO)的原则。数据项按顺序进入队列,并按照进入的顺序依次离开。队列通常用于任务调度、缓冲区管理等场景。例如,在操作系统中,任务队列用于管理等待执行的任务[^2]。 #### 2. 消息队列 消息队列是分布式系统中的一个重要组件,用于在不同服务或应用程序之间传递消息。它不仅具备普通队列的基本功能,还提供了更高级的特性,如消息持久化、可靠性传输、负载均衡异步通信等。消息队列的核心目标是解耦生产者消费者,确保消息能够可靠地传递给消费者[^3]。 #### 队列与消息队列区别总结 | 特性 | 队列 | 消息队列 | |------------------|------------------------------|------------------------------| | 数据结构 | 基本数据结构 | 分布式通信工具 | | 使用场景 | 简单任务调度、缓冲 | 异步通信、解耦合 | | 可靠性 | 不保证消息持久性可靠性 | 提供消息持久化可靠性机制 | | 分布式支持 | 无 | 支持分布式环境 | --- ### 死信队列的作用与应用场景 #### 1. 死信队列的作用 死信队列(Dead Letter Queue, DLQ)是消息队列系统中的一个特殊队列,用于存储无法被正常消费的消息。这些消息可能因为以下原因变成“死信”: - 消息过期(TTL 超时)。 - 消息被消费者拒绝且不再重试(`basic.reject` 或 `basic.nack`,并且 `requeue=false`)。 - 队列达到最大长度限制。 通过将这些失败消息路由到死信队列,可以防止消息丢失,并为后续分析处理提供机会[^1]。 死信队列的核心价值包括: - **防止消息丢失**:将失败消息保存在独立队列中,避免直接丢弃。 - **提高系统可靠性**:自动隔离故障消息,防止其阻塞正常队列。 - **实现延迟重试**:将死信队列作为缓冲区,定时重新投递消息[^2]。 #### 2. 死信队列的应用场景 - **订单业务**:在电商系统中,如果用户下单后未在指定时间内支付,订单消息会被发送到死信队列,等待超时后解锁库存[^4]。 - **库存解锁服务**:当库存锁定消息到达延时队列并超过设定时间后,消息被转发到死信队列,触发库存解锁逻辑。 - **异常监控**:在复杂系统中,死信队列可以捕获所有异常消息,便于集中排查问题。 --- ### 示例代码:RabbitMQ 中配置死信队列 以下是使用 RabbitMQ 实现死信队列的示例代码: ```python import pika # 连接到 RabbitMQ 服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明普通队列,并设置死信交换机 args = { "x-dead-letter-exchange": "dlx_exchange", "x-dead-letter-routing-key": "dlq_key" } channel.queue_declare(queue="normal_queue", arguments=args) # 声明死信交换机死信队列 channel.exchange_declare(exchange="dlx_exchange", exchange_type="direct") channel.queue_declare(queue="dead_letter_queue") channel.queue_bind(exchange="dlx_exchange", queue="dead_letter_queue", routing_key="dlq_key") # 发送测试消息 channel.basic_publish(exchange="", routing_key="normal_queue", body="Test Message") print("Message sent to normal queue.") connection.close() ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值