rabbitmq持久化问题


声明:本文转载自https://my.oschina.net/zcjlq/blog/1561148,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

MQ做为消息中间件,主要用在程序间通信。使用spring集成rabbitmq后,在xml配置文件,可以很方便的设置是否持久化,代码如下:

    <!-- 定义交换器 -->     <rabbit:fanout-exchange name="AMC_TMP_EXCHANGE" auto-declare="true" durable="true">         <rabbit:bindings>             <rabbit:binding queue="AMC_TMP_QUEUE"/>         </rabbit:bindings>     </rabbit:fanout-exchange>      <!--定义队列-->     <rabbit:queue name="AMC_TMP_QUEUE" auto-declare="true" durable="true"/>

其中 durable表示持久化,默认就是true,持久化的意思,不配置这个参数也一样。

我们可以看到spring实现后,默认队列queue和交换机exchange都是持久化的。那么这样配置之后就真的持久化了吗?在《rabbitmq实战》一书中讲到消息持久化的问题,只有将消息也设置成持久化才是真正的持久化。

实际上我们可以为消息Message设置MessageProperties属性, 查看源码发现默认是持久化方式:

public class MessageProperties implements Serializable {          static final String DEFAULT_CONTENT_TYPE = CONTENT_TYPE_BYTES;          static final MessageDeliveryMode DEFAULT_DELIVERY_MODE = MessageDeliveryMode.PERSISTENT;//默认消息是持久化 

再看运行后日志:

下面是java代码,使用了spring整合后的rabbitTemplate

public class PublishStart {     private static final Logger log = LoggerFactory.getLogger(PublishStart.class);     public static void main(String[] args) {         ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-publish-rabbitMQ.xml");         RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);         rabbitTemplate.convertAndSend("< publish message 内容为:" + new Date().toString() + " >");

 

2017-11-05 22:03:14,843 [main]  [org.springframework.amqp.rabbit.core.RabbitTemplate]-[DEBUG]  Executing callback RabbitTemplate$$Lambda$4/1798219673 on RabbitMQ Channel: Cached Rabbit Channel:  AMQChannel(amqp://zcjlq@127.0.0.1:5672//vhostjlq,1), conn: Proxy@4e08711f Shared Rabbit Connection:  SimpleConnection@74e52ef6 [delegate=amqp://zcjlq@127.0.0.1:5672//vhostjlq, localPort= 57523] 2017-11-05 22:03:14,843 [main]  [org.springframework.amqp.rabbit.core.RabbitTemplate]- [DEBUG] Publishing message  (Body:'< publish message 内容为:Sun Nov 05 22:03:14 CST 2017 >'  MessageProperties [headers={}, contentType=text/plain,  contentEncoding=UTF-8, contentLength=58, deliveryMode=PERSISTENT,  priority=0, deliveryTag=0])on exchange [AMC_TMP_EXCHANGE], routingKey = []

倒数第二行显示确实是持久化 deliveryMode=PERSISTENT

 

一条信息从生产者发布到MQ服务器,服务器经过Exchange,根据路由规则分发到Queue,消费者从队列拿到消息。持久化Exchange 和Queue意味着MQ服务器重启后,会自动创建Exchange 和Queue,消息如果设置成非持久化,消息就会丢失。幸好,spring都想到了,全部都是持久化。MQ持久化是将消息记录到磁盘,对性能有影响,但是一般情况下为了消息可靠允许性能损失。

还有一种情况是事务,但是事务对性能影响极大,大概降低2-10倍吞吐量,而且会使生产者应用程序产生同步,rabbitmq团队想到了另外一个方案:发送方确认模式,和事务类似。后面文章再做介绍。

本文发表于2017年11月06日 10:38
(c)注:本文转载自https://my.oschina.net/zcjlq/blog/1561148,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2266 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1