RabbitMQ中的cluster、mirrored queue,以及 warrens机制、RAM node、disk node及vhost介绍
1、RAM node和disk node的区别?
RAM node仅将fabric(即queue、exchange和binding等RabbitMQ基础构件)相关元数据保存到内存中,但disk node会在内存和磁盘中均进行存储。RAM node上唯一会存储到磁盘上的元数据是cluster中使用的disk node的地址。要求在RabbitMQ cluster中至少存在一个disk node。
2、vhost是什么?起什么作用?
vhost 可以理解为虚拟 broker,即mini-RabbitMQ server。其内部均含有独立的queue、exchange 和binding等,但最最重要的是,其拥有独立的权限系统,可以做到vhost 范围的用户控制。当然,从RabbitMQ的全局角度,vhost可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的vhost中)。
3、在单node系统和多node构成的cluster系统中声明queue、exchange,以及进行binding会有什么不同?
当你在单 node上声明queue时,只要该node上相关元数据进行了变更,你就会得到Queue.Declare-ok 回应;而在cluster上声明queue,则要求 cluster上的全部node都要进行元数据成功更新,才会得到Queue.Declare-ok回应。另外,若node类型为RAM node则变更的数据仅保存在内存中,若类型为disk node则还要变更保存在磁盘上的数据。
4、客户端连接到cluster中的任意node上是否都能正常工作?
是的。客户端没有什么不同。
5、若cluster中拥有某个queue的owner node失效了,且该queue被声明具有durable属性,是否能够成功从其他node上重新声明该queue?
不能,在这种情况下,将得到404 NOTFOUND错误。只能等queue所属的node恢复后才能使用该queue。但若该queue本身不具有durable属性,则可在其他node上重新声明。
6、为什么heavy RPC的使用场景下不建议采用 disk node?
heavy RPC是指在业务逻辑中高频调用RabbitMQ提供的RPC机制,导致不断创建、销毁reply queue,进而造成disk node的性能问题(因为会针对元数据不断写盘)。所以在使用RPC机制时需要考虑自身的业务场景。
7、routing_key和binding_key的最大长度是多少?
255字节。
8、什么情况下producer不主动创建queue是安全的?
(1)message是允许丢失的;
(2)实现了针对未处理消息的republish功能(例如采用Publisher Confirm 机制)。
9、RabbitMQ中的cluster、mirrored queue,以及 warrens机制分别用于解决什么问题?存在哪些问题?
cluster是为了解决当cluster中的任意node失效后,producer和consumer均可以通过其他node继续工作,即提高了可用性;另外可以通过增加node数量增加cluster的消息吞吐量的目的。cluster本身不负责 message的可靠性问题(该问题由producer通过各种机制自行解决);cluster无法解决跨数据中心的问题(即脑裂问题)。另外,在cluster 前使用HAProxy可以解决 node的选择问题,即业务无需知道 cluster中多个node的ip地址。可以利用HAProxy进行失效node的探测,可以作负载均衡。下图为HAProxy +cluster 的模型。
Mirrored queue是为了解决使用cluster时所创建的queue的完整信息仅存在于单一node上的问题,从另一个角度增加可用性。若想正确使用该功能,需要保证:
(1)consumer需要支持 Consumer Cancellation Notification机制;
(2)consumer必须能够正确处理重复message。
Warrens是为了解决cluster中message可能被blackholed的问题,即不能接受producer不停 republish message但RabbitMQ server 无回应的情况。Warrens有两种构成方式,一种模型是两台独立的RabbitMQ server+HAProxy,其中两个server的状态分别为active和hot-standby。
该模型的特点为:两台server之间无任何数据共享和协议交互,两台server可以基于不同的RabbitMQ版本。
另一种模型为两台共享存储的RabbitMQ server+keepalived,其中两个server的状态分别为active和cold-standby。该模型的特点为:两台server基于共享存储可以做到完全恢复,要求必须基于完全相同的RabbitMQ版本。
Warrens模型存在的问题:
对于第一种模型,虽然理论上讲不会丢失消息,但若在该模型上使用持久化机制,就会出现这样一种情况,即若作为active的server异常后,持久化在该 server 上的消息将暂时无法被 consume,因为此时该 queue将无法在作为hot-standby的server上被重建,所以,只能等到异常的active server恢复后,才能从其上的queue中获取相应的message进行处理。而对于业务来说,需要具有:
a.感知AMQP连接断开后重建各种fabric的能力;
b.感知 active server 恢复的能力;
c.切换回 active server的时机控制,以及切回后,针对message先后顺序产生的变化进行处理的能力。
对于第二种模型,因为是基于共享存储的模式,所以导致active server异常的条件,可能同样会导致cold-standby server异常;另外,在该模型下,要求 active和cold-standby的server必须具有相同的node名和UID,否则将产生访问权限问题;最后,由于该模型是冷备方案,故无法保证cold-standby server能在你要求的时限内成功启动。
RabbitMQ中的cluster、mirrored queue,以及 warrens机制、RAM node、disk node及vhost介绍相关推荐
- RabbitMQ:镜像队列Mirrored queue
在上一节[url=http://flyingdutchman.iteye.com/admin/blogs/1911811]<RabbitMQ集群类型一:在单节点上构建built-in内置集群&g ...
- [Erlang 0090] RabbitMQ 集群: Mirrored Queue
之前提到过在集群环境中,队列只有元数据会在集群的所有节点同步,但是队列中的数据只会存在于一个节点;这不免让人失望:数据没有冗余容易丢数据甚至在durable的情况下,如果所在的节点当掉就要等待节点恢复 ...
- RabbitMQ中RPC的实现及其通信机制
RabbitMQ中RPC的实现:客户端发送请求消息,服务端回复响应消息,为了接受响应response,客户端需要发送一个回调队列的地址来接受响应,每条消息在发送的时候会带上一个唯一的correlati ...
- Python实现RabbitMQ中6种消息模型(转)
RabbitMQ与Redis对比 RabbitMQ是一种比较流行的消息中间件,之前我一直使用redis作为消息中间件,但是生产环境比较推荐RabbitMQ来替代Redis,所以我去查询了一些Rab ...
- RabbitMQ中的生产者消费者与订阅发布者两种模式
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进 ...
- Rabbitmq中常用的五种连接方式
目录 前提准备 方式一: Hello World 服务端(provider)代码 客户端(customer)代码 方式二: work(以下方式都是通过工具类来创建connection对象) 有两种方 ...
- 深入理解RabbitMQ中的prefetch_count参数
目录 prefetch_count参数的含义 RabbitMQ客户端中prefetch_count源码跟踪 prefetch_count参数使用 prefetch_count参数最佳实践 小结 pre ...
- java 队列和rabbitmq_java – 如何在不使消息出列的情况下浏览rabbitmq中的队列
我正在尝试获取具有特定相关ID的消息,如rabbitmq docs中所述.但是我看到无关的消息被出列了.我不希望它发生.在得到消息后,我怎么能告诉rabbitmq没有出队,并且知道这不是我想要的那个. ...
- Openlayers中使用Cluster+Overlay实现点击单个要素和聚合要素时显示不同弹窗
场景 Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合: Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合_BADAO_LIUMANG_QIZHI的博客 ...
最新文章
- 微型计算机一般按字长进行分类,关于计算机中:字,字节,字长,位的关系
- windows10访问ubuntu samba共享文件夹报错:不允许一个用户使用一个以上用户与服务器多重连接(没解决)
- Centos6.4 编译安装 nginx php
- DisJSet:Wireless Network(POJ 2236)
- python接口自动化(六)--发送get请求接口(详解)
- 将字符串转为16进制数_Python 如何将字符串转为字典
- ROS入门 常用工具
- python 文本处理操作
- redis客户端使用密码
- Eclipse 新手使用教程
- 解决Tomcat在cmd乱码问题
- Cherno OpenGL 教程
- Hvdc-vsc. 基于vsc的柔性直流输电模型 pscad实现
- STM8L 低功耗模式说明
- 升级这十点认知,你就是大佬!
- matlab命令行运行,命令行运行matlab
- word2010里脚注横线如何顶格
- 开源夏令营之项目汇报7
- 浅析文本挖掘(jieba模块的应用)
- 机器学习-增量训练方法