51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个船舶动力设备监控系统,该系统需要实时采集发动机的转速、温度、油压等传感器数据,并存储到数据库中。请描述系统架构(前端、后端、数据库)、数据采集方式(如MQTT、Modbus)、数据存储方案(时序数据库 vs 关系型数据库)及高可用设计。

CSSC 中国船舶集团华南船机有限公司计算机系统员难度:困难

答案

1) 【一句话结论】
船舶动力设备监控系统采用分层架构(前端可视化、后端处理、数据库存储),通过工业级MQTT(低延迟)和Modbus(工业标准)协议实时采集数据,选用时序数据库(如InfluxDB)存储高频时序数据,通过主从复制、负载均衡实现高可用,并采用端到端加密(传输+存储)确保数据安全,满足船舶环境下抗电磁干扰、传感器冗余的实时监控需求。

2) 【原理/概念讲解】
老师口吻:系统架构分为三层,前端(Web界面)展示实时数据(如转速曲线、仪表盘),后端(服务器)负责数据解析、校验(如异常检测)、业务逻辑,数据库存储原始数据。数据采集需考虑船舶环境特殊需求:比如抗电磁干扰,使用工业级传感器和设备(如屏蔽电缆、冗余传感器),传感器冗余(双传感器数据比对,故障时切换)。数据采集协议:MQTT是发布/订阅模式,低延迟适合物联网设备;Modbus是工业标准,用于读取设备寄存器(如转速、温度)。数据存储选择时序数据库,因为时间序列数据高频写入(如每秒多次),时序数据库通过时间索引优化查询效率。高可用设计:数据库主从复制(主节点写入,从节点同步,Raft算法保证一致性),前端/后端多实例+负载均衡(如Nginx),故障时健康检查(心跳检测)触发自动切换。数据安全:传输层TLS加密(防止窃取),数据库存储加密(如InfluxDB的加密存储),传感器端数据加密(AES,确保数据在采集链路安全)。

3) 【对比与适用场景】

特性时序数据库(如InfluxDB)关系型数据库(如MySQL)
定义专为时间序列数据设计,支持高并发写入,时间索引优化查询传统关系型数据库,支持ACID事务和复杂SQL查询
特性高写入性能(每秒百万级)、时间聚合优化、支持标签过滤(如设备ID、时间范围)ACID事务、支持复杂关联查询(如设备与报警记录关联)、事务一致性
使用场景传感器数据(转速、温度)、日志、指标监控(高频数据,如每秒多次写入)设备元数据(设备ID、型号)、配置信息、业务关联数据(如报警记录、设备维护日志)
注意点不适合复杂关联查询,查询性能在聚合后较好;需关注数据生命周期管理写入性能较低(适合少量写入),适合结构化查询,不适合高频时间序列
性能对比(船舶监控场景)写入延迟低(毫秒级),查询时间序列数据(如1小时数据聚合)效率高写入延迟高(秒级),查询时间序列数据需复杂SQL,效率低

4) 【示例】

  • 数据采集(MQTT + Modbus + 消息队列):伪代码(后端服务)
    // MQTT客户端(持久化连接,重连机制)
    const mqtt = require('mqtt');
    const client = mqtt.connect('wss://industrial-broker.com:8883', {
      protocol: 'wss',
      clientId: 'engine-monitor-E1',
      clean: true,
      reconnectPeriod: 5000,
      will: { topic: 'engine/status', payload: 'disconnected', qos: 2 }
    });
    client.on('connect', () => {
      client.subscribe('engine/data', (err) => {
        if (err) console.error('MQTT订阅失败:', err);
      });
    });
    client.on('message', (topic, message) => {
      try {
        const data = JSON.parse(message.toString());
        // 校验数据(如值范围)
        if (data.rpm < 0 || data.rpm > 6000) throw new Error('转速异常');
        // 存储数据(通过消息队列持久化)
        storeToKafka(data);
      } catch (e) {
        console.error('数据校验失败:', e);
      }
    });
    
    // Modbus通信(读取传感器寄存器)
    const modbus = require('modbus');
    const clientModbus = new modbus.client.TCP({ host: '192.168.1.100', port: 502 });
    clientModbus.connect((err) => {
      if (err) console.error('Modbus连接失败:', err);
      // 定时读取(每秒一次)
      setInterval(() => {
        clientModbus.readHoldingRegisters(0, 1, (err, data) => {
          if (err) console.error('Modbus读取失败:', err);
          const rpm = data.registers[0] * 100; // 转速寄存器
          const temp = clientModbus.readHoldingRegisters(2, 1).registers[0]; // 温度寄存器
          const pressure = 2.5; // 油压(假设固定或从其他寄存器读取)
          const point = {
            rpm,
            temp,
            pressure,
            timestamp: new Date()
          };
          storeToKafka(point);
        });
      }, 1000);
    });
    
    // 消息队列(Kafka)持久化(避免MQTT丢失)
    const kafka = require('kafka-node');
    const clientKafka = new kafka.KafkaClient({ kafkaHost: 'kafka:9092' });
    const producer = new kafka.Producer(clientKafka);
    producer.on('ready', () => {
      producer.send([{ topic: 'engine-data', messages: JSON.stringify(data) }], (err, data) => {
        if (err) console.error('Kafka发送失败:', err);
      });
    });
    
    // 数据存储(InfluxDB写入)
    const influx = require('influx');
    const db = new influx.InfluxDB({ host: 'influxdb:8086', database: 'engine' });
    db.writePoints([
      {
        measurement: 'engine',
        tags: { id: 'E1', type: 'diesel' },
        fields: { rpm, temp, pressure },
        timestamp: new Date()
      }
    ], { database: 'engine' }, (err) => {
      if (err) console.error('InfluxDB写入失败:', err);
    });
    
  • 高可用配置(数据库主从):InfluxDB集群配置(主节点写入,从节点同步,Raft协议保证一致性),负载均衡器(如HAProxy)分发请求到后端多实例。

5) 【面试口播版答案】
面试官您好,针对船舶动力设备监控系统,我设计的方案采用分层架构:前端通过Web界面展示实时转速、温度等数据图表,后端处理数据解析和异常检测,数据库存储原始数据。数据采集方面,传感器通过工业级MQTT(低延迟)和Modbus(工业标准)协议传输数据,传输过程采用TLS加密确保安全。考虑到船舶环境特殊需求,系统采用抗电磁干扰的工业设备(如屏蔽电缆)和传感器冗余(双传感器数据比对,故障时切换),保障数据采集可靠性。数据存储选择时序数据库(如InfluxDB),因为它专为高频时间序列数据优化,写入性能高(每秒百万级),支持时间索引和聚合查询。高可用设计上,数据库采用主从复制(主节点写入,从节点同步,Raft算法保证一致性),前端/后端部署多实例并通过负载均衡实现高并发访问,同时配置MQTT客户端重连和消息队列(Kafka)持久化,确保数据不丢失。这样既能满足船舶环境下实时监控的需求,又能保证系统稳定和数据安全。

6) 【追问清单】

  • 问:数据库主从复制如何保证数据一致性?
    回答要点:主节点写入数据后,通过Raft算法同步到从节点,故障时主从切换,确保数据一致性。
  • 问:如果MQTT消息丢失,系统如何处理?
    回答要点:客户端配置重连机制(定时重连),消息重传,并结合消息队列(Kafka)持久化,避免数据丢失。
  • 问:为什么选择时序数据库而不是关系型数据库?
    回答要点:时序数据库专为高频时间序列数据优化,写入性能高(支持每秒百万级写入),时间索引和聚合查询效率高,适合传感器数据的高频采集。
  • 问:船舶环境下数据安全如何保障?
    回答要点:数据传输采用TLS加密,防止数据在传输中被窃取;数据库存储加密(如InfluxDB的加密存储),传感器端数据加密(AES),确保数据在采集、传输、存储全链路安全。
  • 问:高可用设计中的故障切换流程是怎样的?
    回答要点:当主数据库故障时,负载均衡器检测到健康检查失败,自动切换到从节点,后端服务快速恢复,确保系统无中断。

7) 【常见坑/雷区】

  • 坑1:忽略船舶环境特殊需求,未提及抗电磁干扰、传感器冗余,导致切题不足。
  • 坑2:高可用设计不具体,仅说“集群”,未说明主从复制、健康检查机制。
  • 坑3:数据采集容错机制缺失,未提及MQTT重连、消息队列持久化,导致数据丢失风险。
  • 坑4:数据安全不全面,仅提及传输加密,未考虑数据库存储加密或传感器端加密。
  • 坑5:存储选择错误,用关系型数据库存储时序数据,导致写入性能差,无法满足高频数据需求。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1