关于MQ的几件小事(二)如何保证消息队列的高可用

1.RabbitMQ的高可用

RabbitMQ基于主从模式实现高可用。RabbitMQ有三种模式:单机模式,普通集群模式,镜像集群模式。 (1)单机模式: 单机模式就是demo级别的,生产中不会有人使用。 (2)普通集群模式 普通集群模式就是在多台机器上启动多个rabbitmq实例,每一个机器启动一个。可是建立的queue只会放在一个rabbitmq实例上面,可是其余的实例都同步了这个queue的元数据。在你消费的时候,若是链接到了另外一个实例,他会从拥有queue的那个实例获取消息而后再返回给你。 网络

普通集群模式示意图.png
这种方式并无作到所谓消息的高可用,就是个普通的集群,这样还会致使要么消费者每次随机链接一个实例而后拉取数据,这样的话在实例之间会产生网络传输,增长系统开销,要么固定链接那个queue所在的实例消费,这样会致使单实例的性能瓶颈。

并且若是那个方queue的实例宕机了,会致使接下来其余实例都没法拉取数据;若是没有开启消息的持久化会丢失消息;就算开启了消息的持久化,消息不必定会丢,可是也要等这个实例恢复了,才能够继续拉取数据。 因此这个并无提供高可用,这种方案只是提升了吞吐量,也就是让集群中多个节点来服务某个queue的读写操做。 (3)镜像集群模式 这种模式,才是rabbitmq提供是真正的高可用模式,跟普通集群不同的是,你建立的queue,不管元数据仍是queue里面是消息数据都存在多个实例当中,而后每次写消息到queue的时候,都会自动把消息到多个queue里进行消息同步。 架构

镜像集群模式示意图.png
这种模式的好处在于,任何一台机器宕机了,其余的机器还可使用。
坏处在于: 一、性能消耗太大,全部机器都要进行消息的同步,致使网络压力和消耗很大。二、没有扩展性可言,若是有一个queue负载很重,就算加了机器,新增的机器仍是包含了这个queue的全部数据,并无办法扩展queue。
如何开启镜像集群模式: 在控制台新增一个镜像集群模式的策略,指定的时候能够要求数据同步到全部节点,也能够要求同步到指定节点,而后在建立queue的时候,应用这个策略,就会自动将数据同步到其余的节点上面去了。

2.kafka的高可用

(1)kafka的一个基本架构:多个broker组成,一个broker是一个节点;你建立一个topic,这个topic能够划分红多个partition,每一个partition能够存在于不一样的broker上面,每一个partition存放一部分数据。这是自然的分布式消息队列。分布式

实际上rabbitmq并非分布式消息队列,他就是传统的消息队列,只不过提供了一些集群、HA的机制而已,由于不管如何配置,rabbitmq一个queue的数据就存放在一个节点里面,镜像集群下,也是每一个节点都放这个queue的所有数据。post

kafka在0.8之前是没有HA机制的,也就是说任何一个broker宕机了,那个broker上的partition就丢了,无法读也无法写,没有什么高可用可言。性能

kafka在0.8以后,提过了HA机制,也就是replica副本机制。每一个partition的数据都会同步到其余机器上,造成本身的replica副本。而后全部的replica副本会选举一个leader出来,那么生产者消费者都和这个leader打交道,其余的replica就是follower。写的时候,leader会把数据同步到全部follower上面去,读的时候直接从leader上面读取便可。
为何只能读写leader: 由于要是你能够随意去读写每一个follower,那么就要关心数据一致性问题,系统复杂度过高,容易出问题。kafka会均匀度讲一个partition的全部数据replica分布在不一样的机器上,这样就能够提升容错性。 这样就是高可用了,由于若是某个broker宕机了,没事儿,那个broker的partition在其余机器上有副本,若是这上面有某个partition的leader,那么此时会从新选举出一个现代leader出来,继续读写这个新的leader便可。 cdn

kafka高可用架构示意图.png
写消息: 写数据的时候,生产者就写leader,而后leader将数据落到磁盘上以后,接着其余follower本身主动从leader来pull数据。一旦全部follower同步好了数据,就会发送ack个leader,leader收到了全部的follower的ack以后,就会返回写成功的消息给消息生产者。(这只是一种模式,能够调整)。
读数据: 消费数据的时候,只会从leader进行消费。可是只有一个消息已经被全部follower都同步成功返回ack的时候,这个消息才会被消费者读到。

上一篇《消息队列的用途、优缺点、技术选型
下一篇《如何保证消息不重复消费blog

相关文章
相关标签/搜索