操作类 本节介绍了分布式消息服务RabbitMQ产品常见操作类问题。 无法被路由的消息,去了哪里? 如果没有任何设置,无法路由的消息会被直接丢弃。 无法路由的情况:Routing key不正确。 解决方案: 1.使用mandatorytrue配合ReturnListener,实现消息回发。 2.声明交换机时,指定备份交换机。 多个消费者监听一个队列时,消息如何分发? 1.RoundRobin(轮询) 默认的策略,消费者轮流、平均地收到消息。 2.Fair dispatch(公平分发) 如果要实现根据消费者的处理能力来分发消息,给空闲地消费者发送更多消息,可以用basicQos(int prefetchcount)来设置。prefetchcount含义:当消费者有多条消息没有响应ACK时,不再给这个消费者发送消息。 消息在什么时候会变成Dead Letter(死信)? 1.消息被拒绝并且没有设置重新入队:(NACK Reject ) && requeue false 2.消息过期(消息或者队列的TTL设置) 3.消息堆积,并且队列达到最大长度,先入队的消息编程DL。 解决方案:可以在声明队列时,指定一个Dead Letter Exchange,来实现Dead Letter的转发,保证消息不会丢失。 如何进行消息持久化? 所谓持久化,就是RabbitMQ将内存中的数据(比如交换机、队列、消息等)固化到磁盘,以防止异常情况的发生时造成数据丢失。 持久化分类 说明 交换机持久化 在创建Exchange时设置durable参数参数。channel.exchangeDeclare(EXCHANGENAME, "direct", true); 队列持久化 同样也是设置设置durable参数。持久化的队列会存盘,在服务器重启的时候可以保证不丢失相关信息。channel.queueDeclare(QUEUENAME, true, false, false, null); 消息持久化 即使交换机、队列持久化不会因为重启丢失,但是存储在队列中的消息仍然会丢失。解决的办法就是设置消息的投递模式为2,即代表持久化(JAVA)。理论上,可以将所有的消息都设置为持久化,但是这会严重影响RabbitMQ性能,因为写入到磁盘的速度可比写入到内存的速度慢非常多。因此,在选择是否要持久化消息时,需要在可靠性和吞吐量之间做一个权衡。