- Producer
- Customer
- NameServer: Broker的注册服务发现中心
- BrokerServer:主要负责消息的存储、投递和查询以及服务高可用保证
RocketMQ的集群部署:
- 单个master的分支
- 多个Master 模式:集群中有多个 Master 节点,彼此之间相互独立。生产者可以将消息发送到任意一个 Master 节点,消费者也可以从任意一个 Master 节点消费消息
- 多个Master 和 多个Slave 模式 :
-
- 同步双写:每个 Master 节点都有一个或多个 Slave 节点与之对应。在消息写入时,生产者发送的消息不仅要写入 Master 节点,还要同步写入对应的 Slave 节点,只有当 Master 和 Slave 都写入成功,才会向生产者返回成功响应。
- 异步复制:同样是每个 Master 节点配备一个或多个 Slave 节点,但消息写入时,生产者发送的消息只需要写入 Master 节点成功,就会向生产者返回成功响应,而 Master 节点会异步地将消息复制到 Slave 节点
为什么RocketMQ不使用Zookeeper,反而自己写NameServer>
在第三种模式中,Master只需要做好自己的事情就行了,不需要需要知道彼此的存在。
ZooKeeper可以提供Master选举功能。比如Kafka用来给每个分区选一个broker作为leader。
对于RocketMQ来说,topic的数据在每个Master上是对等的,没有哪个Master上有topic上的全部数据。不用处理维护之间的关系。
RocketMQ的高可用:
- NameServer的高可用:NameServer存放的数据相同
- BrokerServer: 主从模式,从可以被消费,并且从节点可以转成主
- consumer 的高可用:当master不可以用的话,可以从slave读取
- produce : 多个master读取
raft的模式可以自动选择主节点
- 每个 Broker 与 NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer。
- Producer 与 NameServer 集群中的其中一个节点建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向 Master 发送心跳。Producer 完全无状态。
- Consumer 与 NameServer 集群中的其中一个节点建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master、Slave 建立长连接,且定时向 Master、Slave 发送心跳。Consumer 既可以从 Master 订阅消息,也可以从 Slave 订阅消息。