文档简介:
Q:无法被路由的消息,去了哪里?
A:如果没有任何设置,无法路由的消息会被直接丢弃。
无法路由的情况:Routing key不正确。
解决方案:
1.使用mandatory=true配合ReturnListener,实现消息回发。
2.声明交换机时,指定备份交换机。
Q:多个消费者监听一个队列时,消息如何分发
A:Round-Robin(轮询)
默认的策略,消费者轮流、平均地收到消息。
Fair dispatch(公平分发)
如果要实现根据消费者地处理能力来分发消息,给空闲地消费者发送更多消息,可以用basicQos(int prefetch_count)来设置。prefetch_count地含义:当消费者有多条消息没有响应ACK时,不再给这个消费者发送消息。
Q:消息在什么时候会变成Dead Letter(死信)
A:消息被拒绝并且没有设置重新入队:(NACK || Reject ) && requeue == false
消息过期(消息或者队列的TTL设置)
消息堆积,并且队列达到最大长度,先入队的消息编程DL。
解决方案:可以在声明队列时,指定一个Dead Letter Exchange,来实现Dead Letter的转发,保证消息不会丢失。
Q:如何进行消息持久化?
A:所谓持久化,就是RabbitMQ将内存中的数据(比如交换机、队列、消息等)固化到磁盘,以防止异常情况的发生时造成数据丢失。
RabbitMQ持久化分为:
1.交换机持久化;
2.队列持久化;
3.消息持久化
交换机的持久化
在创建Exchange时设置durable参数参数。
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);
队列的持久化
同样也是设置设置durable参数。
持久化的队列会存盘,在服务器重启的时候可以保证不丢失相关信息。
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
消息的持久化
即使交换机、队列持久化不会因为重启丢失,但是存储在队列中的消息仍然会丢失。
解决的办法就是设置消息的投递模式为2,即代表持久化(JAVA)。
理论上,可以将所有的消息都设置为持久化,但是这会严重影响RabbitMQ性能,因为写入到磁盘的速度可比写入到内存的速度慢非常多。因此,在选择是否要持久化消息时,需要在可靠性和吞吐量之间做一个权衡。
Q:控制台出现400或者404错误
A:一般出现400或者404错误,是因为用户操作不正确或者输入错误的参数。例如如下图提示:交换器新建队列绑定,由于输入的队列不存在,会报404错误。
Q:如何选择磁盘空间?
A:存储空间说明:
在集群模式中,RabbitMQ需要对消息持久化写入到磁盘中,因为,您在创建RabbitMQ实例选择存储空间时,建议根据业务消息体积预估以及镜像队列副本数量选择合适的存储空间。镜像队列副本数最大为集群的节点数,目前都是3。
例如:业务消息体积预估100GB,则磁盘容量最少应为100GB*3 + 预留磁盘大小100GB。