面试题答案
一键面试架构设计
- 多副本机制:RocketMQ支持主从架构,通过配置多副本,例如将Broker配置为2主2从,当主节点出现故障时,从节点可以接管工作,保障消息的存储和消费不中断。如在
broker-a.properties
和broker-b.properties
中配置主从关系。 - 负载均衡:使用RocketMQ的NameServer集群,NameServer之间相互独立,客户端可以随机选择一个NameServer进行连接,获取Broker信息,实现负载均衡。Spring Boot应用通过配置多个NameServer地址来实现,如
rocketmq.name-server=namesrv1:9876;namesrv2:9876
。 - 消息分区:合理设置Topic的分区数,根据业务量将消息分散到不同的分区,提高并行处理能力。比如订单消息,按照订单ID的哈希值分配到不同分区,避免单个分区压力过大。
配置调优
- Broker配置:
- 调整
broker.conf
中的flushDiskType
为ASYNC_FLUSH
,异步刷盘可以提高写入性能,但会有少量数据丢失风险。适用于对数据一致性要求不高但追求高性能的场景。 - 增加
maxMessageSize
,根据业务需求适当增大单个消息的最大长度,如设置为8192
KB,避免因消息过大而被拒绝。
- 调整
- 客户端配置:
- 在Spring Boot的
application.properties
中,设置rocketmq.producer.sendMsgTimeout
为合适的值,如5000
毫秒,防止发送消息时过长时间等待。 - 配置
rocketmq.consumer.consumeThreadMin
和rocketmq.consumer.consumeThreadMax
,根据服务器性能和消息处理复杂度,设置消费线程数范围,如20
和50
,提高消费效率。
- 在Spring Boot的
代码实现
- 生产者代码:
上述代码通过@Component public class RocketMQProducer { @Autowired private RocketMQTemplate rocketMQTemplate; public void sendMessage(String topic, Object message) { rocketMQTemplate.syncSend(topic, message, 3000); } }
RocketMQTemplate
发送消息,设置了3000毫秒的超时时间,保证发送操作在合理时间内完成。 - 消费者代码:
此代码定义了一个消费者,监听@Component @RocketMQMessageListener(topic = "exampleTopic", consumerGroup = "exampleGroup") public class RocketMQConsumer implements RocketMQListener<String> { @Override public void onMessage(String message) { // 消息处理逻辑 System.out.println("Received message: " + message); } }
exampleTopic
主题的消息,在onMessage
方法中处理接收到的消息,简单打印消息内容,实际应用中可替换为具体业务逻辑。同时利用Spring Boot的自动装配和注解简化了消费者的开发。