DLX ,全称为 Dead-Letter-Exchange ,可以称之为死信交换器。当消息在一个队列中变成死信 (dead message) 之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX ,绑定 DLX 的队列就称之为死信队列。
消息变成死信一般由于以下几种情况:
消息被拒绝
消息过期
队列达到最大长度(最大长度默认是多大?怎么设置?)
DLX 是一个正常的交换器,和一般的交换器没有区别,它能在任何的队列上被指定际上就是设置某个队列的属性。当这个队列中存在死信时 RabbitMQ 就会自动地将这个消息新发布到设置的 DLX ,进而被路由到另一个队列,即死信队列。可以监听这个队列中的消息、以进行相应的处理。
延时队列在rabbitmq中可通过过期时间(TTL)和死信队列(DLX)实现延时队列
优先级队列可设置队列支持的最大优先级,然后发送消息时设置消息的优先级。但是要注意这种情况只在消费者能力小于生产者,有消息堆积时有效。
持久化RabbitMQ的持久化分为3个部分:交换器的持久化、队列的持久化和消息的持久化。但是如果将所有消息持久化,将会严重影响rabbitmq的性能。
即使将交换器、队列和消息都设置了持久化,也不能保证消息100%不丢失。
从消费者端,防止消费者收到消息还没来得及处理就宕机的情况,需要将autoAck设置为false
从生产者断,防止发送到rabbitmq后还没来的及落盘rabbitmq就宕机的情况,可以在生产者端引入事务机制或者发送方确认机制来保证消息己经正确地发送并存储RabbitMQ 中(前提还要保证在调用 channel.basicPublish 方法的时候交换器能够将消息正确路由到相应的队列之中)或者引入镜像队列来保证高可用
消息的有序性很多资料上说rabbitmq可以保证消息的有序,其实是不严谨的。在不使用任何 RabbitM 高级特性 ,也没有消息丢失、网络故障之类异常的情况发生,并且只有一个消费者的情况下,最好也只有一个生产者的情况下可以保证消息的顺序性。如果有多个生产者同时发送消息,无法确定消息到达 Broker 的前后顺序,也就无法验证消息的顺序性。
如果要保证消息的顺序性,需要业务方使用 RabbitMQ 之后做进一步的处理,比如在消息体内添加全局有序标识(类似SequenceID) 来实现。
惰性队列RabbitMQ 3.6.0 版本开始引入了惰性队列 lazy Queue 的概念。惰性队列会尽可能地将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、宕机或者由于维护而关闭等〉致使长时间内不能消费消息而造成堆积时惰性队列就很有必要了。
面试资料和电子书上面进阶的内容可能只是零散的知识点,如果想比较成体系的深入了解的话,还是建议读本关于rabbitmq的书,个人比较推荐《RabbitMQ实战指南》(电子书看文末)。
看完后如果还想查漏补缺,或者应对面试,可以看一下网上的知识点总结或者最新的面试题汇总。(我自己搜集汇总了一下,避免重复浪费时间,大家可以看文末获取)
学习的最好方法就是实践,建议大家像上面写的那样在自己机器上安装学习一下,不要只停留在纸面上。
最后因为电子书和面试题都是PDF,所以我都上传到了网盘,大家可以关注我回复:rabbitmq,获取电子书和最新面试题汇总和一些优化实验报告。