面试题答案
一键面试实现思路
- 生产者:
- 消息分区:在发送消息时,根据业务关键信息(如订单ID)进行Hash计算,将消息发送到特定的分区。这样相同业务逻辑相关的消息会被发送到同一个分区,确保顺序性。例如,如果是订单相关消息,按照订单ID进行分区,同一个订单的创建、支付、发货等消息会在同一分区。
- 批量发送:将多条消息批量打包发送,减少网络请求次数,提高发送效率。但要注意批量消息大小不能超过RocketMQ限制(默认4MB)。
- Broker:
- 主从架构:采用主从模式,主节点负责接收和处理消息,从节点作为备份。主节点故障时,从节点能快速切换为主节点,保证服务可用性。
- 存储优化:使用高性能的存储介质(如SSD),并且采用顺序写的方式存储消息,提高写入速度。同时,合理配置刷盘策略,如采用同步刷盘保证数据不丢失,在高并发场景下如果对性能要求极高也可考虑异步刷盘,但有数据丢失风险。
- 消费者:
- 单线程消费:对于每个分区,消费者使用单线程消费,确保分区内消息按顺序处理。这样能保证同一个分区内消息处理的顺序性。
- 多消费者实例:为了提高整体消费效率,可部署多个消费者实例,每个实例负责不同的分区,并行处理消息。
配置要点
- 生产者配置:
- ProducerGroup:合理设置生产者组,方便管理和故障恢复。不同业务的生产者可设置不同的ProducerGroup。
- sendMsgTimeout:设置合适的发送消息超时时间,防止因网络等问题导致长时间等待。
- Broker配置:
- brokerRole:配置主从角色,如
ASYNC_MASTER
(异步主节点)、SYNC_MASTER
(同步主节点)等。 - flushDiskType:设置刷盘类型,
SYNC_FLUSH
(同步刷盘)或ASYNC_FLUSH
(异步刷盘)。 - storePathRootDir:指定消息存储目录,建议使用高性能存储设备挂载的目录。
- brokerRole:配置主从角色,如
- 消费者配置:
- ConsumerGroup:设置消费者组,同一业务逻辑的消费者应在同一组内。
- consumeThreadMin 和 consumeThreadMax:设置消费者线程池最小和最大线程数,在单线程消费分区的基础上,合理调整线程池大小来提高消费效率。
- consumeMode:设置为
CONSUME_ORDERLY
,保证按顺序消费。