RabbitMQ消费者异常情况处理方案

目录

一、消费者异常情况处理

二、多次重试依然失败怎么处理


一、消费者异常情况处理

业务代码自己重试或者组件重试

RabbitMQ配置重试:

#开启重试,消费者代码不能添加try catch捕获不往外抛异常
spring.rabbitmq.listener.simple.retry.enabled=true
#最大重试次数
spring.rabbitmq.listener.simple.retry.max-attempts=4
# 重试消息的时间间隔,5秒
spring.rabbitmq.listener.simple.retry.initial-interval=5000

二、多次重试依然失败怎么处理

解决方式:RepublishMessageRecoverer

消息重试一定次数后,用特定的routingKey转发到指定的交换机中,方便后续排查和告警

注意: 消息消费确认使用自动确认方式

#消息确认方式,manual(手动ack) 和auto(自动ack); 消息消费重试到达指定次数进到异常交换机和异常队列,需要改为自动ack确认消息
@Configuration
@Data
public class RabbitMQErrorConfig {

    private String shortLinkErrorExchange = "short_link.error.exchange";

    private String shortLinkErrorQueue = "short_link.error.queue";

    private String shortLinkErrorRoutingKey = "short_link.error.routing.key";

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 异常交换机
     * @return
     */
    @Bean
    public TopicExchange errorTopicExchange(){
        return new TopicExchange(shortLinkErrorExchange,true,false);
    }

    /**
     * 异常队列
     * @return
     */
    @Bean
    public Queue errorQueue(){
        return new Queue(shortLinkErrorQueue,true);
    }

    /**
     * 队列与交换机进行绑定
     * @return
     */
    @Bean
    public Binding BindingErrorQueueAndExchange(Queue errorQueue,TopicExchange errorTopicExchange){
        return BindingBuilder.bind(errorQueue).to(errorTopicExchange).with(shortLinkErrorRoutingKey);
    }


    /**
     * 配置 RepublishMessageRecoverer
     * 用途:消息重试一定次数后,用特定的routingKey转发到指定的交换机中,方便后续排查和告警
     *
     * 顶层是 MessageRecoverer接口,多个实现类
     *
     * @return
     */
    @Bean
    public MessageRecoverer messageRecoverer(){
        return new RepublishMessageRecoverer(rabbitTemplate,shortLinkErrorExchange,shortLinkErrorRoutingKey);
    }

}

 消息重试4次后,被发送到了short_link.error.routing.key

 

剩下的就是业务监听这个 short_link.error.routing.key队列,处理发送邮件等信息告警了

@Component
@Slf4j
@RabbitListener(queuesToDeclare = { @Queue("short_link.error.queue") })
public class ShortLinkErrorMQListener {

    @RabbitHandler
    public void shortLinkHandler(EventMessage eventMessage, Message message, Channel channel) throws IOException {
        log.error("告警:监听到消息ShortLinkErrorMQListener eventMessage消息内容:{}",eventMessage);
        log.error("告警:Message:{}",message);
        log.error("告警成功,发送通知短信");

    }
}

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ 是一个功能强大的消息队列中间件,但消息重复消费是一个常见的问题。有几种常见的原因可能导致消息重复消费: 1. 网络问题或连接中断:当消费者RabbitMQ 接收到消息后,如果网络出现问题或连接中断,可能会导致消费者无法发送确认消息给 RabbitMQ,从而导致 RabbitMQ 认为该消息没有被正确消费,然后重新将该消息发送给其他消费者。 2. 消费者应用程序异常终止:如果消费者应用程序在处理消息的过程中崩溃或异常终止,RabbitMQ 将重新将该消息发送给其他消费者。 3. 消息处理失败未确认:如果消费者应用程序在处理消息时发生错误,并且没有发送确认消息告知 RabbitMQ 消息处理失败,RabbitMQ 将重新将该消息发送给其他消费者。 为了解决消息重复消费的问题,可以考虑以下几点: 1. 使用消息的唯一标识符:在消息的属性中添加唯一标识符,并在消费者对已经处理过的消息进行记录。这样,在接收到新消息时,可以先检查该消息是否已经被处理过,避免重复处理。 2. 设置消息的过期时间:可以为每条消息设置一个过期时间,在一定时间内未被消费者处理,则认为该消息已过期,不再重新发送给其他消费者。 3. 使用幂等性操作:在消费者处理消息的过程中,尽量使用幂等性操作,即使同样的消息被多次处理,也不会对系统状态造成影响。 4. 异常处理和消息确认:在消费者应用程序中,及时捕捉并处理异常情况,并在消息处理完成后发送确认消息给 RabbitMQ,确保消息被正确消费。 这些是一些常见的解决方案,根据实际情况选择适合的方法来避免消息重复消费

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值