1. 持久化
持久化:将信息写入到磁盘,关机或重启后能从磁盘恢复数据
RabbitMQ的持久化包含三类:交换机、对列、消息
1.1 交换机持久化
- 重启之后,交换机依然存在
- 在Features一栏,显示为持久化(D)
- 通过durable=true参数指明持久化交换机
1.2 队列持久化
- 重启后,队列依然存在
- 通过durable=true参数指明
1.2.1 可选exclusive参数
- 只能被第一次声明该队列的连接可见,连接断开后自动删除
- 同一个连接的不同信道可以同时访问该队列的
- 适用场景:客户端读取消息
1.2.2 可选autoDelete参数
- 如果没有任何订阅的消费者,自动删除
- 使用场景:临时队列
1.3 消息持久化
- 消息在队列中,但还没被消费,服务器重启后,消息依然存在
- 前提是队列必须是持久化的,否则无意义
- 通过MessageProperties.PERSISTENT_TEXT_PLAIN指明持久化消息
- 持久化消息会影响MQ性能,降低吞吐量
2. 可靠性
可靠性:指生产者发送的消息是否投递到消费者端被成功消费
可能会出现的几种不可靠情况:
- 客户端消息发送失败
- RabbitMQ投递消息失败
- 消费者消费失败
2.1 生产者保证可靠投递
2.1.1 Mandatory属性
2.1.2 Confirm属性(消息确认机制Publisher Confirm)
2.2 RabbitMQ持久化
- 交换机持久化 durable=true
- 队列持久化 durable=true
- 消息持久化 delivery_mode=2
2.3 消费者保证可靠消费
-
当消息被消费者正确收到(消费者手动的basic.ack或指定队列auto_ack=true),就会从队列中移除
-
消费者在没有收到ACK之前,生产者不会继续向消费者投递消息(可以以此来限流)
-
消息确认和拒绝:channel.basicAck()/channel.basicNack()
3. 基本概念
3.1 信道Channel
- 信道是生产者与消费者通信的渠道
- 信道建立在TCP上
- 一个TCP连接被多个线程共享,每个线程对应一个信道

使用信道的好处:提高吞吐、TCP连接复用、减轻服务器压力