RabbitMQ消息

消息持久化

        rabbitmq通过将消息保存到日志文件中来实现持久化,对于持久化消息的发送,rabbitmq在写入到日志文件后才会发送确认。此外要想实现消息持久化,必须将exchange、queue、message同时设置成持久化。

        使用持久化会在一定程序下降低rabbitmq的吞吐量(10倍甚至更低),原因是需要写磁盘,但持久化可以防止由重启宕机等原因造成的消息丢失。此外由于队列在集群环境中只会存在一个节点上,所以持久化在rabbitmq集群环境上并不靠谱,节点宕机后上面所有的队列都会消息。

事务模式与发送确认

        将信道设置成事务模式后:发送消息时,rabbitmq会确保消息成功路由到队列后才会返回;在事务中的多条消息命令,会严格按顺序执行,只有前面的全部成功,后面的才会被执行。所以事务模式虽然可以保证消息路由成功,控制执行顺序,但同样也会严重降低rabbitmq吞吐量,于是发送确认机制诞生。

        信道设置成confirem模式后,在该信道上发布的所有消息都会被分派一个唯一的ID,rabbitmq最终会回复一个确认信号通知生产者发送成功还是失败,对于持久化消息,确认时机是路由成功并且写入日志文件后。

Mnesia

        Mnesia是内建在Erlang中的一个非SQL型数据库,RabbitMQ使用它来存储Exchange、Queue、及绑定信息(除了消息内容),rabbitmq中有队列元数据 、交换器元数据、绑定元数据、vhost元数据四种,Mnesia会将RabbitMQ元数据首先写入一个日志文件中,然后再定期将日志内容存到真实的Mnesia数据库文件中。

通过一个dump_log_write_threshold控制着存储频率,表示N个条目时就存储。

RabbitMQ日志及通过AMQP访问日志

        rabbitmq默认会在/var/log/rabbitmq目录下,生成两种日志: nodeNamexx-sal.log、nodeNamexx.log。sasl通常记录关于erlang的一些信息,如erlang崩溃等; 而xx.log用来记录用户的相关操作,如用护连接、创建一个vhost等等。
  

rabbitmq默认提供一个amq.rabbitmq.log的topic交换器,rabbitmq会将日志信息发布到该交换器上,并用严重级别error、warning和info为路由。,通过编码监听该队列即可获取日志相关信息


RabbitMQ对RPC的支持

        这里只简单的说下,原因是它并不专业,首先使用rabbitmq来实现RPC对网络稳定性依赖很大,其实它本质上来说是异步的。实现逻辑比较简单,发送消息时指定自己监听的队列(通过reply_to指定),消费方消费完成后,往该队列中写入响应即可。

RabbitMQ集群
1)集群中的队列和交换机

  rabbitmq内建集群的好处很明显,通过添加节点可以实现线性扩容,提高消息吞吐量,原因在于队列的完整信息(元数据、状态、内容等)永远只会存在一个节点上,其它节点只会持有该队列的元数据信息,及该队列所在节点信息。这样带的好处主要有两点:一空间成本低;二性能较好,在发布消息时不需要将消息存储到每个节点。但是这种情况下,如果该节点挂掉,则所有针对该节点上队列的访问都无法正常获取结果,直到节点恢复。

  对于Exchange,由于它并不存储数据,本质上只是一个绑定列表,所以rabbitmq将它存储在所有节点上。

  当在集群环境中声明队列或交换器时,这些操作会直到所有节点都成功声明才会返回。

2)镜像队列

  与普通队列的区别在于,镜像队列在集群环境中的其它节点也会保存一份完整信息,这种情况下如果集群中的一个节点失效了,queue能自动地切换到镜像中的另一个节点以保证服务的可用性。
  每一个镜像队列都包含一个master和多个slave,slave会准确地按照master执行命令的顺序进行命令执行,故slave与master上维护的状态应该是相同的。除了publish外所有动作都只会向master发送,然后由master将命令执行的结果广播给slave们,故看似从镜像队列中的消费操作实际上是在master上执行的。“
  一旦完成了选中的slave被提升为master的动作,发送到镜像队列的message将不会再丢失:publish到镜像队列的所有消息总是被直接publish到master和所有的slave之上。这样一旦master失效了,message仍然可以继续发送到其他slave上。
 

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
	ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
		all:表示在集群中所有的节点上进行镜像
		exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
		nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
	ha-params:ha-mode模式需要用到的参数
	ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
priority:可选参数,policy的优先级

2)集群节点
  
集群环境中节点可以分为内存节点(元数据存储在内存中)磁盘节点(单机环境下只允许磁盘节点,不然每次重启后信息都会丢失),但rabbitmq要求集群环境下,至少要有一个磁盘节点(实际情况下一般都会提供2个),只有一个的情况下崩溃的话,像创建队列、权限、添加集群节点等这些操作就都无法完成,但消息还是可以发送,运行还是可以正常。
  当增加节点或节点离开时,都需要及时通知磁盘节点,所以在搭建集群环境cluste的时候,加入集群时需要列出所有磁盘节点,这些节点需要与磁盘节点通信来获取最新的元数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值