持久化

    rabbitmq的持久化分成三个部分:交换器的持久化、队列的持久化和消息的持久化

    交换器的持久化是通过exchangeDeclare的时候指定durable为true实现的
    队列的持久化是通过queueDeclare的时候指定durable为true实现的
    消息的持久化是将消息的投递模式 (BasicProperties 中的deliveryMode 属性,MessageProperties.PERSISTENT_TEXT_PLAIN也封装了)设置为2即可实现消息的持久化。

注意:

    如果交换器不设置持久化,那么在 RabbitMQ 服务重启之后,相关的交换器元数据会丢失,不过消息不会丢失,只是不能将消息发送到这个交换器中了
    如果队列不设置持久化,那么在 RabbitMQ 务重启之后,相关队列的元数据会丢失,此时数据也会丢失
    设置了队列和消息的持久化,当 RabbitMQ 服务重启之后,消息依旧存在。单单只设置队列持久化,重启之后消息会丢失;单单只设置消息的持久化,重启之后队列消失,继而消息也丢失。单单设置消息持久化而不设置队列的持久化显得毫无意义。

    将所有的消息都设直为持久化,会严重影响 RabbitMQ 的性能。
    即使将交换器、队列、消息都设置了持久化之后数据还是会有可能丢失

防止消息丢失:

     消费者订阅队列时将autoAck设置为false,消费完成进行手动确认,防止收到消息还没处理完就宕机了。
     引入RabbitMQ的镜像队列机制相当于配置了副本,如果主节点(master)在此特殊时间内挂掉,可以自动切换到从节点(slave)。这样有效地保证了高可用性,除非整个集群都挂掉。虽然这样也不能完全保证 RabbitMQ 消息不丢失,但是配置了镜像队列要比没有配置镜像队列的可靠性要高很多
    还可以在发送端引入事务机制或者发送方确认机制来保证消息己经正确地发送并存储至RabbitMQ 中。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • “持久化”可以提高RabbitMQ的可靠性,以防在异常情况(重启、关闭、宕机等)下的数据丢失。RabbitMQ的持...
    代码的搬运工阅读 3,561评论 0 1
  • 重启RabbitMQ后,队列和交换器都会消失(随同里面的消息),原因在于每个队列和交换器的durable属性,该属...
    GhostStories阅读 2,291评论 0 6
  • 持久化可以提高RabbitMQ的可靠性,以防在RabbitMQ重启、关闭、宕机下的数据丢失。 1.交换器的持久化 ...
    12点前睡觉hhh阅读 6,060评论 1 0
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,364评论 0 13
  • 感觉自己有点神经衰弱,总是觉得手机响了;屋外有人走过;每次妈妈不声不响的进房间突然跟我说话,我都会被吓得半死!一整...
    章鱼的拥抱阅读 2,233评论 4 5