面试题答案
一键面试1. RocketMQ生产者端负载均衡将消息发送到不同Broker的方式
RocketMQ生产者端通过MQFaultStrategy
和DefaultMQProducerImpl
类来实现负载均衡发送消息到不同Broker。
- 基于Topic的路由信息:生产者首先从NameServer获取Topic的路由信息,包括该Topic分布在哪些Broker上,以及每个Broker上的队列信息。
- 选择队列算法:
- 默认轮询:
MQFaultStrategy
默认采用轮询算法选择队列。例如,DefaultMQProducerImpl
中的selectOneMessageQueue
方法,每次从可用队列列表中顺序选择一个队列来发送消息。如果有多个队列(假设为Queue1
、Queue2
、Queue3
),第一次选Queue1
,第二次选Queue2
,第三次选Queue3
,第四次又回到Queue1
,以此类推。这样能较均匀地将消息分布到不同队列,进而发送到不同Broker(因为队列分布在不同Broker上)。 - 自定义策略:用户也可以实现
MessageQueueSelector
接口来自定义选择队列的策略,如根据消息中的某个属性(例如订单ID的哈希值)来选择队列,这样相同属性的消息会发送到同一队列,从而保证消息的顺序性等特殊需求。
- 默认轮询:
2. Broker出现故障时生产者端负载均衡策略的应对
- 故障检测:
MQFaultStrategy
会实时检测Broker的健康状态。当发送消息失败时,会记录该Broker的失败次数等信息。同时,内部有定时任务SendMessageThread
会周期性地检查Broker是否恢复可用。 - 隔离策略:对于检测到故障的Broker,
MQFaultStrategy
会将其隔离一段时间(故障延迟机制)。在这段时间内,生产者不会向该故障Broker发送消息,从而避免不必要的消息发送失败。例如,当一个Broker出现故障后,可能会被隔离5分钟(可配置),在这5分钟内,负载均衡算法在选择队列时,不会选择位于该故障Broker上的队列。 - 动态调整可用Broker列表:随着Broker故障的发生和恢复,生产者会从NameServer重新获取最新的Topic路由信息,更新可用的Broker列表以及队列信息。负载均衡算法基于新的可用列表进行队列选择,从而将消息发送到正常的Broker上。例如,当一个Broker故障恢复后,生产者获取到新路由信息,该Broker及其队列重新纳入负载均衡选择范围,继续接收消息发送。