面试题答案
一键面试1. 消息队列选型
选择如 Kafka、RabbitMQ 这类成熟的消息队列系统。Kafka 适合高吞吐量场景,RabbitMQ 功能丰富,支持多种消息协议和灵活的路由。
2. 消息路由策略
- 基于设备类型路由:在消息生产者端,根据设备类型设置消息的路由键(routing key)。例如,将传感器设备数据发送到特定队列,执行器设备数据发送到另一队列。在 RabbitMQ 中,通过 Direct Exchange 根据路由键精准路由消息到相应队列;在 Kafka 中,可通过自定义分区策略,将同一设备类型的数据发送到特定分区。
- 基于数据特性路由:除设备类型外,依据数据本身特性,如数据所属业务模块等,进一步细分路由。比如,设备的状态数据和控制指令数据发送到不同队列,以实现更精细的处理。
3. 不同优先级消息处理机制
- 设置消息优先级属性:在消息生产者端,为消息设置优先级字段。例如,对于实时监控报警数据设置高优先级,设备常规运行状态数据设置低优先级。
- 优先级队列实现:
- RabbitMQ:可通过设置队列的
x - max - priority
参数开启优先级队列功能。消费者从优先级队列消费时,会优先处理高优先级消息。 - Kafka:原生不直接支持消息优先级,但可通过自定义分区器,将高优先级消息发送到特定分区,然后配置更多消费者处理该分区,以实现类似高优先级处理效果。
- RabbitMQ:可通过设置队列的
4. 实现微服务间松耦合
- 生产者与消费者解耦:各设备作为消息生产者,只需将数据发送到消息队列,无需关心哪个微服务会处理。微服务作为消费者,从消息队列订阅感兴趣的消息,生产者和消费者之间不存在直接依赖。
- 动态扩展与替换:当新增微服务或需要替换现有微服务时,只需调整消息队列的订阅关系。例如,新增加一个数据分析微服务,只需让该微服务从相应数据队列订阅消息即可,无需修改其他微服务代码。
5. 保证系统一致性和可靠性
- 数据持久化:
- Kafka:通过配置
log.dirs
存储路径,将消息持久化到磁盘。同时,通过设置副本因子(replication factor),将消息复制到多个副本,防止节点故障数据丢失。 - RabbitMQ:将队列和消息设置为持久化,队列声明时设置
durable
为true
,消息发布时设置deliveryMode
为 2。这样即使 RabbitMQ 服务器重启,队列和消息也不会丢失。
- Kafka:通过配置
- 事务处理:
- Kafka:从 0.11.0.0 版本开始支持事务,通过
KafkaTransaction
API,生产者可以保证多个消息原子性地写入到多个分区,确保数据一致性。 - RabbitMQ:通过
txSelect
开启事务,生产者在发送消息前开启事务,发送消息后提交事务,若发送过程中出现异常则回滚事务,保证消息的可靠发送。
- Kafka:从 0.11.0.0 版本开始支持事务,通过
- 消费确认机制:
- Kafka:消费者通过
commitSync()
或commitAsync()
方法手动提交消费偏移量,确保已处理的消息不会被重复消费。 - RabbitMQ:消费者设置为手动确认模式(
autoAck = false
),在处理完消息后调用basicAck
方法确认消息,若未确认,RabbitMQ 会将消息重新投递给其他消费者或在一定时间后再次投递给该消费者。
- Kafka:消费者通过