RabbitMQ基于主从模式实现高可用。RabbitMQ有三种模式:单机模式,普通集群模式,镜像集群模式。 (1)单机模式: 单机模式就是demo级别的,生产中不会有人使用。 (2)普通集群模式 普通集群模式就是在多台机器上启动多个rabbitmq实例,每一个机器启动一个。可是建立的queue只会放在一个rabbitmq实例上面,可是其余的实例都同步了这个queue的元数据。在你消费的时候,若是链接到了另外一个实例,他会从拥有queue的那个实例获取消息而后再返回给你。 网络
并且若是那个方queue的实例宕机了,会致使接下来其余实例都没法拉取数据;若是没有开启消息的持久化会丢失消息;就算开启了消息的持久化,消息不必定会丢,可是也要等这个实例恢复了,才能够继续拉取数据。 因此这个并无提供高可用,这种方案只是提升了吞吐量,也就是让集群中多个节点来服务某个queue的读写操做。 (3)镜像集群模式 这种模式,才是rabbitmq提供是真正的高可用模式,跟普通集群不同的是,你建立的queue,不管元数据仍是queue里面是消息数据都存在多个实例当中,而后每次写消息到queue的时候,都会自动把消息到多个queue里进行消息同步。 架构
(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
上一篇《消息队列的用途、优缺点、技术选型》
下一篇《如何保证消息不重复消费》blog