网站源码生成器,网站设计资源,完整的社群营销方案,jquery timelinr wordpress面试题#xff1a;你们是如何保证消息不丢失的#xff1f;
1、什么是死信
死信就是消息在特定场景下的一种表现形式#xff0c;这些场景包括#xff1a; 1. 消息被拒绝访问#xff0c;即消费者返回 basicNack 的信号时 或者拒绝basicReject 2. 消费者发生异常#xff0…面试题你们是如何保证消息不丢失的
1、什么是死信
死信就是消息在特定场景下的一种表现形式这些场景包括 1. 消息被拒绝访问即消费者返回 basicNack 的信号时 或者拒绝basicReject 2. 消费者发生异常超过重试次数 。 其实spring框架调用的就是 basicNack 3. 消息的Expiration 过期时长或队列TTL过期时间。.ttl(20*1000) 进入的是 先进业务队列的数据.业务队列中先进入队列的信息会阻塞门口,不让过期的信息进入死信队列直到自己过期才放行,后期用rabbitmq的延时队列插件,实现同一个队列中有多个不同超时时间的消息并按时间超时顺序出队 4. 消息队列达到最大容量 .maxLength(5).先进业务队列的消息由死信交换机进入死信队列 述场景经常产生死信即消息在这些场景中时被称为死信
2、什么是死信队列
死信队列就是用于储存死信的消息队列在死信队列中有且只有死信构成不会存在其余类型的消息。
死信队列在 RabbitMQ 中并不会单独存在往往死信队列都会绑定这一个普通的业务消息队列当所绑定的消息队列中有消息变成死信了那么这个消息就会重新被交换机路由到指定的死信队列中去我们可以通过对这个死信队列进行监听从而手动的去对这一消息进行补偿。 人工干预 3、那么我们到底如何来使用死信队列呢 只需要在声明业务队列的时候绑定指定的死信交换机和RoutingKey即可。 死信交换机一般用直连交换机,将死信路由到指定的死信队列;业务则用广播交换机
消息队列达到最大容量;队列TTL过期时间 Configuration
public class OrderingOKConsumer {//死信交换机用直连Beanpublic DirectExchange deadExchange() {return ExchangeBuilder.directExchange(ordering_ok_dlx).durable(true).build();}
//私信队列和正常没啥区别Beanpublic Queue deadQueue() {return QueueBuilder.durable(ordering_ok_wms_dl).build();}
//死绑Beanpublic Binding bindingDead() {return BindingBuilder.bind(deadQueue()).to(deadExchange()).with(ordering_ok_wms_dl);}
//业务交换机用广播Beanpublic FanoutExchange exchange5() {return ExchangeBuilder.fanoutExchange(ordering_ok).durable(true).build();}
//业务队列,要和死信交换机和队列绑定Beanpublic Queue queue5() {return QueueBuilder.durable(ordering_ok_wms).maxLength(3).deadLetterExchange(ordering_ok_dlx).deadLetterRoutingKey(ordering_ok_wms_dl).ttl(10000)//设置队列过期时间.build();}Beanpublic Binding binding5() {return BindingBuilder.bind(queue5()).to(exchange5());}//RabbitListener(queues ordering_ok_wms)public void consumer(OrderingOk msg) {System.out.println(ordering_ok_wms收到消息 msg);int i 1 / 0;}
}消息的Expiration 过期时长
Service
public class OrderingOkProvider {Autowiredprivate RabbitTemplate rabbitTemplate;public void send(OrderingOk msg) {rabbitTemplate.convertAndSend(ordering_ok,,msg,message - {Long idmsg.getId();int expire 0;switch (id.intValue()){case 1:expire 50*1000;break;case 2:expire 40*1000;break;case 3:expire 30*1000;break;case 4:expire 20*1000;break;case 5:expire 10*1000;break;}// message.getMessageProperties().setExpiration(expire);return message;});}
}
4. 自动应答死信配置 #-------------MQ 高级配置--------- #预抓取数量 spring.rabbitmq.listener.simple.prefetch250 #设置消费者手动应答模式 spring.rabbitmq.listener.simple.acknowledge-mode auto #开启自动应答重试机制 spring.rabbitmq.listener.simple.retry.enabledtrue #默认重试3次 spring.rabbitmq.listener.simple.retry.max-attempts3 #重试间隔时间 单位ms spring.rabbitmq.listener.simple.retry.initial-interval1000ms #时间间隔倍数默认是1倍 spring.rabbitmq.listener.simple.retry.multiplier2 #最大间隔时间 spring.rabbitmq.listener.simple.retry.max-interval5000ms