面试题答案
一键面试架构调整
- 多Master多Slave模式:采用多Master多Slave且Master与Slave之间采用异步复制的模式。这样在某个Master节点出现故障时,Slave节点可以快速切换为Master继续提供服务,保证系统的高可用性。例如,一个金融交易系统部署3个Master节点,每个Master节点对应一个Slave节点。
- Namesrv集群部署:Namesrv是RocketMQ的路由信息管理中心,部署多个Namesrv实例形成集群。生产者和消费者可以通过配置多个Namesrv地址来实现高可用的路由发现,当某个Namesrv节点故障时,其他节点仍能正常提供服务。
- 分层架构:在应用层和RocketMQ之间可以引入消息中间层,该中间层负责消息的预处理、幂等性处理等。比如,在金融交易场景中,中间层可以对交易消息进行合法性校验,防止非法消息进入MQ队列。
参数配置优化
- 刷盘策略:采用同步刷盘策略(SYNC_FLUSH),确保消息在写入Broker内存后立即刷入磁盘,保证消息可靠性。虽然同步刷盘会降低一定的性能,但在金融交易这种对消息可靠性要求极高的场景下是必要的。
- 消息队列数量:根据业务并发量合理设置消息队列数量。如果队列数量过少,可能导致消息堆积,影响处理速度;队列数量过多,则会增加系统资源消耗。例如,对于每秒有1000笔交易的金融系统,可以根据历史数据和测试,设置50 - 100个消息队列。
- Producer参数:设置合适的发送超时时间(sendTimeout),避免因网络波动等原因导致消息发送长时间等待。同时,启用重试机制(retryTimesWhenSendFailed),当消息发送失败时自动重试一定次数。
- Consumer参数:设置合理的消费线程数(consumeThreadMin和consumeThreadMax),根据业务处理能力调整消费速度。对于金融交易消息处理,由于涉及复杂的业务逻辑,消费线程数不宜设置过高,以免影响处理准确性。同时,采用顺序消费模式(MessageListenerOrderly)来保证消息的顺序性。
其他优化
- 消息幂等性处理:在消费者端实现消息幂等性,通过为每条消息生成唯一标识,在消费前先检查该消息是否已被处理。例如,在金融交易中,每笔交易都有唯一的交易ID,消费者可以根据交易ID来判断该交易消息是否已处理。
- 监控与报警:搭建完善的监控体系,实时监控RocketMQ的各项指标,如消息堆积量、TPS、延迟等。当指标超出阈值时,及时发送报警信息,以便运维人员快速响应处理。