Rabbitmq如何保证消息可靠性

通常我们在使用rabbitMQ的中主要分为三个部分 消息生产者、RabbitMQ服务端(broker)、消息消费者。所以首先确保这三部分的消息传递正常。

1.确保生产者消息成功发送到exchange中
  通过RabbitTemplate的ConfirmCallback回调方法来查看是否到达exchange

        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            log.info("消息到达exchange状态:correlationData({}),ack({}),cause({})", correlationData, ack, cause);
        });
2.确保exchange中的消息成功到达Queues中
    通过RabbitTemplate的setReturnsCallback回调方法来查看

        rabbitTemplate.setReturnsCallback(returnedMessage -> {
             log.info("exchange到达路由状态:"+ returnedMessage);
        });
rabbitTemplate完整配置如下:
        @Bean
        public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {
            connectionFactory.setPublisherConfirms(true);
            connectionFactory.setPublisherReturns(true);
            RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
            rabbitTemplate.setMandatory(true);
            rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
                log.info("消息到达exchange状态:correlationData({}),ack({}),cause({})", correlationData, ack, cause);
            });
            rabbitTemplate.setReturnsCallback(returnedMessage -> {
                log.info("exchange到达路由状态:"+ returnedMessage);
            });
            return rabbitTemplate;
        }
3.确保消费者成功消费
Rabbitmq默认情况下是自动认为消费成功然后移除队列中的这条Message,可以通过配置application.yml来更改
      rabbitmq:
        listener:
          simple:
            acknowledge-mode: manual 手动模式
            #以下两种是自动提交
            # acknowledge-mode: none 自动模式(默认开启)
            # acknowledge-mode: auto 自动模式
更改完成手动提交后,可以通过channel.basicAck和channel.basicNack来确认是否提交或拒绝
    @RabbitListener(queues = "队列名")
    public void onBidDataMessage(Channel channel, Message message) throws IOException {
        log.info("MQ-收到数据:{}", message);
        /**
         * 执行业务代码....
         * 完成
         */

        //执行成功则手动ACK 
        //方法参数说明:channel.basicAck(channel内的顺序tag,true代表确认所有消息)
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
    
        //执行失败则调用Nack 
        //方法参数说明:(channel内的顺序tag,是否批量处理,是否返回该消息到队列中)
        channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
                   
    }
4.确保其他情况下MQ丢失的一些解决方法
   情况一:某一条消息消费者一直处理失败    
        解决方法:添加到死信队列中
   情况二:MQ服务器宕机                 
        解决方法:设置MQ的队列和消息持久化到磁盘中

以上情况后续有时间再写一篇分析...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值