赞
踩
RabbitMQ的持久化是为了实现服务从异常状态恢复后恢复之前的状态。RabbitMQ发送消息涉及交换器(exchange)、队列(queue)、消息,因而持久化包括交换器的持久化、队列的持久化、消息文本的持久化。获取消息是从队列中获取的、交换器进行的转发,所以为了确保消息的最终持久化,一般交换器、队列、消息都要进行持久化。
刚开始做练习的时候,一直有两个疑问没想通?
1、工作队列练习中只有一个consumer可以接收到消息,交换器类型的练习可以多个consumer接收到消息。一直在想为什么?
对比其差异才发现,工作队列练习多个consumer声明在同一个queue上,而转发器是把消息转发给相匹配的queue上,各自queue上声明的consumer可以从上获取到消息
2、转发器练习先启动消息发送类,再启动消息接收类,无法接收消息。为什么工作队列的练习可以?
转发器是把消息转发给队列,consumer从队列上获取消息。转发器练习中消息发送类中不需要先声明一个队列,先启动发送消息类,这时候没有接收队列,所以消息实际上未发出去。所以consumer只能接收所在队列声明后的消息。
针对上述情况,消息发送时相匹配的队列未创建,消息丢失的情况,可以在发送消息时设置mandatory=true,同时声明ReturnListener监听器,接收未发送出去的消息,避免blackholed现象。所以为了保证消息的可靠投递需要使用mandatory(true)、Publisher confirm(手动应答模式)、持久化三者结合的方式。补充:再加上消息的确认机制可确保消息成功发布到broker
在搭建用户消息时,可以创建临时队列绑定在fanout上接收广播信息(不接收非在线的消息),创建一个持久化私有队列(消息上线即可见),用于接收用户个人信息
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。