07- RabbitMQ的延迟队列有了解过嘛 ?
RabbitMQ的延迟队列有二种实现方案 :
- 使用消息过期TTL + 死信交换机
- 使用延迟交换机插件
08- RabbitMQ如何设置消息过期 ?
RabbitMQ置消息过期的方式有二种 :
- 为队列设置过期时间, 所有进到这个队列的消息就会具有统一的过期时间
@Bean public Queue ttlQueue(){ return QueueBuilder.durable("ttl.queue") // 指定队列名称,并持久化 .ttl(10000) // 设置队列的超时时间,10秒 .deadLetterExchange("dl.ttl.direct") // 指定死信交换机 .build(); }
- 为消息单独设置过期时间
@Test public void testTTLQueue() { // 创建消息 String message = "hello, ttl queue"; // 消息ID,需要封装到CorrelationData中 CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); // 发送消息 rabbitTemplate.convertAndSend("ttl.direct", "ttl", message, correlationData); // 记录日志 log.debug("发送消息成功"); }
注意 :
- 队列过期和消息过期同时存在 , 会以时间短的时间为准
- RabbitMQ队列消息过期的机制是判断队列头部元素是否过期 , 如果队里头部消息没有到过期时间 , 中间消息到了过期时间, 这个消息也不会被自动剔除
09- 什么情况下消息会成为死信 ?
当一个队列中的消息满足下列情况之一时,就会成为死信(dead letter):
- 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false
- 消息是一个过期消息,超时无人消费
- 要投递的队列消息满了,无法投递
10- 什么是死信交换机 ? 如何为队列绑定死信交换机 ?
死 信交换机和正常的交换机没有什么不同 , 如果一个包含死信的队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机
为队列绑定死信交换机 , 只需要设置队列属性 dead-letter-exchange即可
11- RabbitMQ的高可用机制有了解过嘛 ?
RabbitMQ的是基于Erlang语言编写,而Erlang又是一个面向并发的语言,天然支持集群模式。RabbitMQ的集群有两种模式:
•普通集群:是一种分布式集群,将队列分散到集群的各个节点,从而提高整个集群的并发能力。
- 会在集群的各个节点间共享部分数据,包括:交换机、队列元信息。不包含队列中的消息。
- 当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回
- 队列所在节点宕机,队列中的消息就会丢失
•镜像集群:是一种主从集群,普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。
- 交换机、队列、队列中的消息会在各个MQ的镜像节点之间同步备份。
- 所有操作都是主节点完成,然后同步给镜像节点
- 主宕机后,镜像节点会替代成新的主