rabbitmq消息持久化原理

RabbitMQ的消息持久化主要是通过将队列和消息都标记为持久化来实现的。以下是实现消息持久化的两个关键步骤:

  1. 将队列声明为持久化(durable),这样队列元数据会被持久化到磁盘上,即使RabbitMQ服务重启,队列也不会丢失。
  2. 发布消息时将消息标记为持久化,这样消息会被写入到磁盘上,只有当消息被确认写入后,才会从内存中移除。

以下是使用RabbitMQ Java客户端实现消息持久化的示例代码:

import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Channel; public class PersistentPublish {  public static void main(String[] args) throws Exception {    // 创建连接工厂    ConnectionFactory factory = new ConnectionFactory();    factory.setHost("localhost");     // 建立连接    try (Connection connection = factory.newConnection();         Channel channel = connection.createChannel()) {      // 声明一个持久化的队列,如果队列不存在会创建一个      channel.queueDeclare("my-persistent-queue", true, false, false, null);       // 发布一个持久化的消息      String message = "Hello, persistent world!";      channel.basicPublish("", "my-persistent-queue",                            MessageProperties.PERSISTENT_TEXT_PLAIN,                            message.getBytes());      System.out.println(" [x] Sent '" + message + "'");    }  }}
import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Channel; public class PersistentPublish {  public static void main(String[] args) throws Exception {    // 创建连接工厂    ConnectionFactory factory = new ConnectionFactory();    factory.setHost("localhost");     // 建立连接    try (Connection connection = factory.newConnection();         Channel channel = connection.createChannel()) {      // 声明一个持久化的队列,如果队列不存在会创建一个      channel.queueDeclare("my-persistent-queue", true, false, false, null);       // 发布一个持久化的消息      String message = "Hello, persistent world!";      channel.basicPublish("", "my-persistent-queue",                            MessageProperties.PERSISTENT_TEXT_PLAIN,                            message.getBytes());      System.out.println(" [x] Sent '" + message + "'");    }  }}
  • 1.
  • 2.

在这个例子中,queueDeclare 方法的第二个参数设置为 true 表示这个队列是持久化的。basicPublish 方法的第三个参数使用 MessageProperties.PERSISTENT_TEXT_PLAIN 表示消息是持久化的。这样,消息在被确认之前会被写入磁盘,即使RabbitMQ服务重启,这些消息也不会丢失。