Kafka:天然的‘Leader-Slave’无状态集群,每台服务器既是 Master 也是 Slave在线课堂。
分区首领均匀地分布在不同的 kafka 服务器上,分区副本也均匀地分布在不同的 kafka 服务器上,所以每一台 kafka 服务器既含有分区首领,同时又含有分区副本,每一台 kafka 服务器是某一台 kafka 服务器的 Slave,同时也是某一台 kafka 服务器的 leader在线课堂。
kafka 的集群依赖于 zookeeper,zookeeper 支持热扩展,所有的 broker、消费者、分区都可以动态加入移除,而无需关闭服务,与不依靠 zookeeper 集群的 mq 相比,这是最大的优势在线课堂。
rabbitmq:支持简单集群,' 复制 ' 模式,对高级集群模式支持不好在线课堂。
rabbitmq 的每一个节点,不管是单一节点系统或者是集群中的一部分,要么是内存节点,要么是磁盘节点,集群中至少要有一个是磁盘节点在线课堂。
在 rabbitmq 集群中创建队列,集群只会在单个节点创建队列进程和完整的队列信息(元数据、状态、内容),而不是在所有节点上创建在线课堂。
引入镜像队列,可以避免单点故障,确保服务的可用性,但是需要人为地为某些重要的队列配置镜像在线课堂。
zeromq:去中心化,不支持集群在线课堂。
rocketmq:常用 多对 'Master-Slave' 模式在线课堂,开源版本需手动切换 Slave 变成 Master
Name Server 是一个几乎无状态节点,可集群部署,节点之间无任何信息同步在线课堂。
Broker 部署相对复杂,Broker 分为 Master 与 Slave,一个 Master 可以对应多个 Slave,但是一个 Slave 只能对应一个 Master,Master 与 Slave 的对应关系通过指定相同的 BrokerName,不同的 BrokerId 来定义,BrokerId 为 0 表示 Master,非 0 表示 Slave在线课堂。Master 也可以部署多个。每个 Broker 与 Name Server 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 Name Server。
Producer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从 Name Server 取 Topic 路由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向 Master 发送心跳在线课堂。Producer 完全无状态,可集群部署。
Consumer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从 Name Server 取 Topic 路由信息,并向提供 Topic 服务的 Master、Slave 建立长连接,且定时向 Master、Slave 发送心跳在线课堂。Consumer 既可以从 Master 订阅消息,也可以从 Slave 订阅消息,订阅规则由 Broker 配置决定。
客户端先找到 NameServer, 然后通过 NameServer 再找到 Broker在线课堂。
一个 topic 有多个队列,这些队列会均匀地分布在不同的 broker 服务器上在线课堂。rocketmq 队列的概念和 kafka 的分区概念是基本一致的,kafka 同一个 topic 的分区尽可能地分布在不同的 broker 上,分区副本也会分布在不同的 broker 上。
rocketmq 集群的 slave 会从 master 拉取数据备份,master 分布在不同的 broker 上在线课堂。
activemq:支持简单集群模式,比如 ' 主 - 备 ',对高级集群模式支持不好在线课堂。