必备新版RabbitMQ教程-高性能消息队列RabbitMQ课程介绍-小滴课堂-10

第十章 高级特性-RabbitMQ消息可靠性投递+消费
第1集 高级知识点之RabbitMQ消息可靠性投递讲解
简介:Rabbitmq的消息可靠性投递讲解

什么是消息的可靠性投递

保证mq节点成功接受消息

消息发送端需要接受到mq服务端接受到消息的确认应答

完善的消息补偿机制,发送失败的消息可以再感知并二次处理

保证消息百分百发送到消息队列中去

详细

RabbitMQ消息投递路径

生产者到交换机

交换机到队列

通过confirmCallback

通过returnCallback

生产者-->交换机->队列->消费者

通过两个的点控制消息的可靠性投递

建议

开启消息确认机制以后,保证了消息的准确送达,但由于频繁的确认交互, rabbitmq 整体效率变低,吞吐量下降严重,不是非常重要的消息真心不建议用消息确认机制

第2集 新版RabbitMQ消息可靠性投递confirmCallback实战
简介:Rabbitmq的消息可靠性投递confirmCallback实战

生产者到交换机

通过confirmCallback

生产者投递消息后,如果Broker收到消息后,会给生产者一个ACK。生产者通过ACK,可以确认这条消息是否正常发送到Broker,这种方式是消息可靠性投递的核心

开启confirmCallback

#旧版,确认消息发送成功,通过实现ConfirmCallBack接口,消息发送到交换器Exchange后触发回调spring.rabbitmq.publisher-confirms=true#新版,NONE值是禁用发布确认模式,是默认值,CORRELATED值是发布消息成功到交换器后会触发回调方法spring.rabbitmq.publisher-confirm-type: correlated

开发实战

@Autowired private RabbitTemplate template; @Test void testConfirmCallback() {  template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {   /**    *    * @param correlationData 配置    * @param ack 交换机是否收到消息,true是成功,false是失败    * @param cause 失败的原因    */   @Override   public void confirm(CorrelationData correlationData, boolean ack, String cause) {    System.out.println("confirm=====>");    System.out.println("confirm==== ack="+ack);    System.out.println("confirm==== cause="+cause);    //根据ACK状态做对应的消息更新操作 TODO   }  });  template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME+,"order.new","新订单来啦1"); }

模拟异常:修改投递的交换机名称

第3集 新版RabbitMQ消息可靠性投递returnCallback实战
简介:Rabbitmq的消息可靠性投递returnCallback实战

交换机到队列

交换机到队列不成功,则丢弃消息(默认)

交换机到队列不成功,返回给消息生产者,触发returnCallback

通过returnCallback

消息从交换器发送到对应队列失败时触发

两种模式

//为true,则交换机处理消息到路由失败,则会返回给生产者//或者配置文件 spring.rabbitmq.template.mandatory=truetemplate.setMandatory(true); 

第一步 开启returnCallback配置

#新版spring.rabbitmq.publisher-returns=true

第二步 修改交换机投递到队列失败的策略

#为true,则交换机处理消息到路由失败,则会返回给生产者spring.rabbitmq.template.mandatory=true

开发实战

@Test void testReturnCallback() {  //为true,则交换机处理消息到路由失败,则会返回给生产者  //开启强制消息投递(mandatory为设置为true),但消息未被路由至任何一个queue,则回退一条消息  template.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {   @Override   public void returnedMessage(ReturnedMessage returned) {    int code = returned.getReplyCode();    System.out.println("code="+code);    System.out.println("returned="+returned.toString());   }  });  template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"xxx.order.new","新订单来啦11"); }

模拟异常,修改路由key,拼接不存在的路由

第4集 高级特性之RabbitMQ消息确认机制ACK讲解
简介:Rabbitmq的消息确机制ACK讲解

背景:消费者从broker中监听消息,需要确保消息被合理处理

RabbitMQ的ACK介绍

消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除

消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列中

只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。

消息的ACK确认机制默认是打开的,消息如未被进行ACK的消息确认机制,这条消息被锁定Unacked

确认方式

spring:  rabbitmq:    #开启手动确认消息,如果消息重新入队,进行重试    listener:      simple:        acknowledge-mode: manual

其他(基本不用,忽略)

自动确认(默认)

手动确认 manua

第5集 RabbitMQ消息确认机制ACK配置实战+DeliveryTag+Reject介绍
简介:Rabbitmq的消息确机制ACK实战+DeliveryTag介绍

代码实战

@RabbitHandlerpublic void releaseCouponRecord(String body, Message message, Channel channel) throws IOException {        long msgTag = message.getMessageProperties().getDeliveryTag();        System.out.println("msgTag="+msgTag);        System.out.println("message="+message.toString());        System.out.println("body="+body);        //成功确认,使用此回执方法后,消息会被 rabbitmq broker 删除        //channel.basicAck(msgTag,false);    //channel.basicNack(msgTag,false,true);    }

deliveryTag介绍

表示消息投递序号,每次消费消息或者消息重新投递后, deliveryTag都会增加

basicNack和basicReject介绍

basicReject一次只能拒绝接收一个消息,可以设置是否requeue。

basicNack方法可以支持一次0个或多个消息的拒收,可以设置是否requeue。

人工审核异常消息

设置重试阈值,超过后确认消费成功,记录消息,人工处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值