面试题答案
一键面试性能优化
- 生产者优化
- 批量发送:将多条消息合并成一批进行发送,减少网络请求次数。例如在Spring Boot中配置
rocketmq.producer.batch-size
属性。 - 异步发送:采用异步发送方式,提高发送效率。在代码中使用
producer.send(msg, new SendCallback() {... })
进行异步发送。
- 批量发送:将多条消息合并成一批进行发送,减少网络请求次数。例如在Spring Boot中配置
- 消费者优化
- 多线程消费:在Spring Boot应用中,配置
rocketmq.consumer.consumeThreadMin
和rocketmq.consumer.consumeThreadMax
属性,增加消费线程数,加快消息处理速度。 - 批量消费:设置
rocketmq.consumer.consumeMessageBatchMaxSize
属性,消费者一次消费多条消息,减少消费请求次数。
- 多线程消费:在Spring Boot应用中,配置
- RocketMQ配置优化
- 合理设置Topic和Queue数量:根据业务量合理分配Topic和Queue数量,确保负载均衡。一般每个Queue对应一个消费线程。
- 优化存储配置:使用高性能存储设备,如SSD,提高消息存储和读取速度。
消息积压解决方案
- 增加消费者数量:动态增加消费实例数量,提高整体消费能力。可以通过Kubernetes等容器编排工具实现动态扩缩容。
- 提高单个消费者处理能力:如上述消费者优化方式,提高消费线程数和批量消费大小。
- 排查消费逻辑:检查消费逻辑是否存在耗时操作,如数据库复杂查询、远程调用等,进行优化。可以采用异步处理、缓存等方式。
消息重复消费解决方案
- 幂等性处理:在消费逻辑中实现幂等性,确保多次消费结果一致。例如对于数据库操作,使用
INSERT INTO... ON DUPLICATE KEY UPDATE
语句;对于更新操作,使用版本号机制。 - 去重表:创建一张去重表,记录已消费的消息ID,每次消费前先查询去重表,避免重复消费。
Broker节点故障解决方案
- 主从架构:采用RocketMQ的主从架构,主节点故障时,从节点可以自动切换为主节点继续提供服务。在配置文件中设置
brokerRole=SLAVE
来配置从节点。 - 多Broker集群:部署多个Broker节点,分散负载,提高系统可用性。在Spring Boot应用中配置多个NameServer地址,如
rocketmq.name-server=192.168.1.1:9876;192.168.1.2:9876
。
Spring Boot应用中故障处理机制实现
- 消息积压处理:在Spring Boot应用中,可以通过监控Queue的消息堆积情况,如使用RocketMQ的Dashboard或自定义监控指标,当堆积量达到一定阈值时,触发扩缩容操作。
- 消息重复消费处理:在消费逻辑的Service层实现幂等性方法,在Controller层调用该方法进行消费。例如:
@Service
public class MessageConsumerService {
@Transactional
public void handleMessage(Message message) {
// 幂等性处理逻辑
}
}
- Broker节点故障处理:在Spring Boot应用中,配置多个NameServer地址,使应用能够自动发现可用的Broker节点。同时,使用RocketMQ的重试机制,当消息发送或消费失败时,自动重试一定次数。例如配置
rocketmq.producer.retry-times-when-send-failed
属性。