RocketMQ主要通过以下几个方面来保证高可用性:
- 主从部署:在Broker层面,一个Master可以对应多个Slave,当Master宕机时,Slave会自动接管并转变为Master,继续提供服务。
- NameServer集群:多个NameServer节点组成集群,当某个节点宕机时,Producer和Consumer可以切换到其他节点,RocketMQ整个系统可以继续工作。
- 事务消息:通过事务消息机制实现生产者与Broker的二段提交,保证消息不会丢失或重复消费。
- 生产者重试机制:在发生网络异常时,生产者会自动重试发送消息,确保消息能到达Broker。
- 消费者消费重试与拉取重试:在Push模式下,如果Consumer端网络异常导致消息未消费,Broker会定期重推消息;在Pull模式下,Consumer会定期重试拉取消息,保证消息被消费。
- 消息持久化:Broker将接收到的所有消息持久化写入CommitLog,防止消息丢失。
- 容错与恢复:Broker在启动过程中和运行中会定期检查自身状态并进行数据恢复,保证系统高可用。
这些机制对应的主要类:
- HAService:主从部署服务,实现主从切换与消息同步。
- NameServerController:NameServer节点会相互注册为对方的子节点,形成集群。
- EndTransactionProcessor:实现事务消息二段提交与回查。
- MQClientAPIImpl:实现生产者发送消息重试。
- RebalanceService:实现Push消费者消息分发与重试。PullConsumerImpl实现拉消息重试。
- DefaultMessageStore:实现消息持久化与CommitLog管理。
- BrokerController:启动过程检查点恢复,运行期内存数据恢复等。
RocketMQ通过主从部署、NameServer集群、事务机制、重试机制与持久化机制来保证高可用性。理解RocketMQ各个模块的高可用机制与容错机制,可以让我们在使用过程中根据业务需求配置相关参数,保证系统高可用。