如何保证消息队列的高可用?(RabbitMQ)

打印 上一主题 下一主题

主题 1017|帖子 1017|积分 3051

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
RabbitMQ 是基于主从(非分布式)做高可用性的,RabbitMQ 有三种模式:单机模式普通集群模式镜像集群模式
1、单机模式:一般没人生产用单机模式
2、普通集群模式:
普通集群模式用于进步系统的吞吐量,通过添加节点来线性扩展消息队列的吞吐量。也就是在多台机器上启动多个 RabbitMQ 实例,而队列 queue 的消息只会存放在其中一个 RabbitMQ 实例上,但是每个实例都同步 queue 的元数据(元数据是 queue 的一些配置信息,通过元数据,可以找到 queue 地点实例)。消费的时间,如果连接到了别的的实例,那么该实例就会从数据实际地点的实例上的queue拉取消息过来,就是说让集群中多个节点来服务某个 queue 的读写操作
但普通集群模式的缺点在于:无高可用性,queue地点的节点宕机了,其他实例就无法从那个实例拉取数据;RabbitMQ 内部也会产生大量的数据传输。


3、镜像队列集群模式:
镜像队列集群是RabbitMQ 真正的高可用模式,集群中一般会包含一个主节点master和多少个从节点slave,如果master由于某种原因失效,那么按照slave参加的时间排序,"资历最老"的slave会被提升为新的master。
镜像队列下,全部的消息只会向master发送,再由master将下令的实行结果广播给slave,以是master与slave节点的状态是相同的。比如,每次写消息到 queue 时,master会主动将消息同步到各个slave实例的
① 性能开销大,消息须要同步到全部机器上,导致网络带宽压力和消耗很重queue;如果消费者与slave建立连接并举行订阅消费,其实质上也是从master上获取消息,只不外看似是从slave上消费而已,比如消费者与slave建立了TCP连接并实行Basic.Get的操作,那么也是由slave将Basic.Get请求发往master,再由master准备好数据返回给slave,最后由slave投递给消费者。
从上面可以看出,队列的元数据和消息会存在于多个实例上,也就是说每个 RabbitMQ 节点都有这个 queue 的完整镜像,任何一个机器宕机了,其它机器节点还包含了这个 queue 的完整数据,其他消费者都可以到其它节点上去消费数据。

1)缺点:
① 性能开销大,消息须要同步到全部机器上,导致网络带宽压力和消耗很重
② 非分布式,没有扩展性,如果 queue 的数据量大到这个机器上的容量无法容纳了,此时该方案就会出现题目了
(2)如何开启镜像集群模式呢?
在RabbitMQ 的管理控制台Admin页面下,新增一个镜像集群模式的策略,指定的时间是可以要求数据同步到全部节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时间,应用这个策略,就会主动将数据同步到其他的节点上去了。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表