RocketMQ 主从同步知识点
Broker 分为 master 与 slave,一个 master 可以对应多个 Slave,但一个 slave 只能对应一个 master。
master 与 slave 通过相同的 Broker Name来匹配,不同的 brokerId来定义是 master 还是 slave
Broker 向所有的 NameServer 结点建立长连接,定时注册 Topic 和发送元数据信息。
NameServer 定时扫描(默认2分钟)所有存活broker的连接,如果超过时间没响应则断开连接(心9跳检测),但是 consumer 客户端不能感知,consumer 定时(30s)从NameServer获取 topic 的最新信息,所以broker不可用时,consumer 最多最需要 30s 才能发现(Producer 的机制一样,在未发现 broker 宕机前发送的消息会失败)
只有 master 才能进行写入操作,slave 不允许写入只能同步,同步策略取决于 master 的配置
客户端消费可以从 master 和 slave 消费,默认消费者都从 master 消费,如果在 master 挂后,客户端从 NameServer 中感知到 Broker 宕机,就会从 slave 消费,感知非实时,存在一定的滞后性,slave 不能保证 master 的消息 100% 都同步过来了,会有少量的消息丢失。但一旦master恢复,未同步过去的消息会被最终消费掉
如果 consumer 实例的数量比 message queue 的总数量还多的话,多出来的 consumer 实例将无法分到 queue,也就无法消费到消息,也就无法起到分摊负载的作用,所以需要控制让 queue 的总数量大于等于 consumer 的数量
剑鸣秋朔