RabbitMQ 消费者可靠性——失败重试机制
效果:
消费者抛异常后,会本地重试,如果本地重试次数达到最大重试次数之后,直接给队列返回reject,队列收到后就会丢弃该消息,也就是策略的第一种
但就这样把删了不太好
第二种 ImmediateRequeueMessageRecoverer:消费者抛异常后,会本地重试,如果本地重试次数达到最大重试次数之后,再给MQ返回nack,消息重新入队
第三种方法 RepublishMessageRecoverer:
error.direct:接收失败消息的交换机
error:接收失败消息的交换机 与 队列绑定时的 RoutingKey
代码示例:
package com.itheima.config_RabbitMQ;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.retry.MessageRecoverer;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnProperty(prefix = "spring.rabbitmq.listener.simple.retry", name = "enabled", havingValue = "true")
public class ErrorConfiguration {
@Bean
public DirectExchange errorExchange() {//交换机
return new DirectExchange("error.direct");
}
@Bean
public Queue errorQueue() {//队列
return new Queue("error.queue");
}
@Bean
public Binding errorBinding(Queue errorQueue, DirectExchange errorExchange) {
return BindingBuilder.bind(errorQueue).to(errorExchange).with("error");
}
@Bean
public MessageRecoverer messageRecoverer(RabbitTemplate rabbitTemplate) {
return new RepublishMessageRecoverer(rabbitTemplate, "error.direct", "error");
}
}
RabbitMQ中,当队列把消息传递给消费者了,消费者还没有给MQ返回ack/nack/reject的时候,MQ队列中还有这条消息吗?
ChatGPT答案:
在RabbitMQ中,当消息被传递给消费者后,即使消费者还没有给RabbitMQ返回确认(ack),消息仍然存在于队列中。在这个阶段,消息处于"unacknowledged"状态。
RabbitMQ允许消费者异步地处理消息,并且只有在收到确认时才会将消息从队列中删除。如果消费者成功处理消息并发送了确认,RabbitMQ将会删除该消息。如果消费者遇到错误或者在处理期间发生了异常,它可以选择不发送确认,这样消息会留在队列中,等待重新投递给其他消费者或者重新投递给当前消费者。
在一些情况下,如果消费者处理消息失败,并且不希望重新投递给自己,可以选择使用nack(negative acknowledgment)或者reject来拒绝消息。这也会导致消息从队列中移除。
总的来说,只有在消费者发送确认或者使用拒绝消息的方式时,RabbitMQ才会将消息从队列中删除。在确认之前,消息仍然存在于队列中,等待被处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通