RabbitMQ(三):消息持久化策略

  在正常的服务器运行过程中,时常会面临服务器宕机重启的情况,那么我们的消息此时会如何呢?很不幸的事情就是,我们的消息可能会消失,这肯定不是我们希望见到的结果。所以我们希望AMQP服务器崩溃了也可以将消息恢复,这称之为消息持久化。RabbitMQ自然存在这种策略可以帮助我们完成这件事情。

二、持久化的消息

  当RabbitMQ服务器重启后,原先的队列和交换器会随同里面的消息一同消失。原因在于每个队列和交换器都有durable属性,该属性默认是false,它决定了RabbitMQ是否需要在崩溃或者重启之后重新创建队列或者交换器。将它设置为true就代表了持久性,在服务器重启之后就会重新持久的创建队列和交换器。

  当然做到这点还不够,我们需要的是持久化的消息,所以在消息发布前,通过将消息的“投递模式”(delivery mode)属性设置为2将消息标记为持久化。到目前为止,消息还只是被表示为持久化,还需要被发布到持久化的交换器中并到达持久化的队列中才行。如果不是这样,包含持久化消息的队列或者交换器挥着Rabbit崩溃重启后不复存在,导致消息成为一个孤儿。因此,总结起来需要做到以下三点:

  (1)将消息的投递模式选项设置为2(持久);

  (2)将消息发送到持久化的交换器;

  (3)消息到达持久化的队列。

  注意,如果原先有非持久的交换器或者队列,需要删除后才可重新创建,否则就创建其他名称的交换器或者队列,代码如下:

//声明持久交换器 channel.ExchangeDeclare( "HelloExchange", //交换器名称 ExchangeType.Direct,//交换器类型 true, //是否持久话 false, //是否自动删除 null //关于交换器的详细设置,键值对形式 ); //声明持久队列 channel.QueueDeclare( "HelloQueue",//队列名称 true, //是否持久化 false, //是否只对首次声明的队列可见 false, //是否自动删除 null ////关于队列和队列内消息的详细设置,键值对形式 ); //发布持久消息 string msg_str = "这是生产者第一次发布的消息"; IBasicProperties msg_pro = channel.CreateBasicProperties(); msg_pro.ContentType = "text/plain";//发布的数据类型 msg_pro.DeliveryMode = 2;//标记持久化

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpggdf.html