MST

星途 面试题库

面试题:消息队列在复杂物联网数据处理场景的专家级方案设计

设想一个复杂的物联网场景,其中包含多种类型的设备,不同设备产生的数据具有不同的处理优先级,且数据处理流程涉及多个微服务的协作。请详细设计一个基于消息队列的解决方案,包括消息的路由策略、不同优先级消息的处理机制、以及如何通过消息队列实现微服务之间的松耦合,同时保证整个系统的一致性和可靠性。
43.1万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

1. 消息队列选型

选择如 Kafka、RabbitMQ 这类成熟的消息队列系统。Kafka 适合高吞吐量场景,RabbitMQ 功能丰富,支持多种消息协议和灵活的路由。

2. 消息路由策略

  • 基于设备类型路由:在消息生产者端,根据设备类型设置消息的路由键(routing key)。例如,将传感器设备数据发送到特定队列,执行器设备数据发送到另一队列。在 RabbitMQ 中,通过 Direct Exchange 根据路由键精准路由消息到相应队列;在 Kafka 中,可通过自定义分区策略,将同一设备类型的数据发送到特定分区。
  • 基于数据特性路由:除设备类型外,依据数据本身特性,如数据所属业务模块等,进一步细分路由。比如,设备的状态数据和控制指令数据发送到不同队列,以实现更精细的处理。

3. 不同优先级消息处理机制

  • 设置消息优先级属性:在消息生产者端,为消息设置优先级字段。例如,对于实时监控报警数据设置高优先级,设备常规运行状态数据设置低优先级。
  • 优先级队列实现
    • RabbitMQ:可通过设置队列的 x - max - priority 参数开启优先级队列功能。消费者从优先级队列消费时,会优先处理高优先级消息。
    • Kafka:原生不直接支持消息优先级,但可通过自定义分区器,将高优先级消息发送到特定分区,然后配置更多消费者处理该分区,以实现类似高优先级处理效果。

4. 实现微服务间松耦合

  • 生产者与消费者解耦:各设备作为消息生产者,只需将数据发送到消息队列,无需关心哪个微服务会处理。微服务作为消费者,从消息队列订阅感兴趣的消息,生产者和消费者之间不存在直接依赖。
  • 动态扩展与替换:当新增微服务或需要替换现有微服务时,只需调整消息队列的订阅关系。例如,新增加一个数据分析微服务,只需让该微服务从相应数据队列订阅消息即可,无需修改其他微服务代码。

5. 保证系统一致性和可靠性

  • 数据持久化
    • Kafka:通过配置 log.dirs 存储路径,将消息持久化到磁盘。同时,通过设置副本因子(replication factor),将消息复制到多个副本,防止节点故障数据丢失。
    • RabbitMQ:将队列和消息设置为持久化,队列声明时设置 durabletrue,消息发布时设置 deliveryMode 为 2。这样即使 RabbitMQ 服务器重启,队列和消息也不会丢失。
  • 事务处理
    • Kafka:从 0.11.0.0 版本开始支持事务,通过 KafkaTransaction API,生产者可以保证多个消息原子性地写入到多个分区,确保数据一致性。
    • RabbitMQ:通过 txSelect 开启事务,生产者在发送消息前开启事务,发送消息后提交事务,若发送过程中出现异常则回滚事务,保证消息的可靠发送。
  • 消费确认机制
    • Kafka:消费者通过 commitSync()commitAsync() 方法手动提交消费偏移量,确保已处理的消息不会被重复消费。
    • RabbitMQ:消费者设置为手动确认模式(autoAck = false),在处理完消息后调用 basicAck 方法确认消息,若未确认,RabbitMQ 会将消息重新投递给其他消费者或在一定时间后再次投递给该消费者。