高标科技后端一面:MQTT 数据完整性、消费顺序与知识库引用
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 项目里用了 MQTT,你们是怎么保证数据不被篡改的?
- 你们的数据量大概是多大?怎么保证数据消费的时候出现后来先消费的情况?具体是怎么做的?
- 无人机这个项目里你们和设备有进行直接的数据交互吗,用的什么通信协议?
- 这些项目里有没有让你最抓耳挠腮困扰你的经历?你觉得这个项目的数据链路有哪些可以优化的地方?
- 我看你有介绍说在软件里嵌入知识库问答服务,你们是怎么保证回答的结果是正确或者说引用正确的?
- 有了解 CAN 协议吗?你们机器人比赛里的通信是怎么做的?
- 反问。
《参考解析》
MQTT 数据完整性:先分清「传输安全」和「数据可信」两件事。传输层用 MQTTS(TLS)保证机密性与完整性,客户端双向认证(客户端证书或 token)防止伪造设备接入;应用层再加消息级完整性——每条 payload 带设备 id、时间戳、序号和签名(HMAC 或设备私钥签名),服务端校验签名与时间窗(防重放,配合 nonce 或单调序号)。真正的边界在设备端:密钥存在哪里(安全芯片 vs 明文 flash)、固件能不能被刷。回答时把「我们能做到什么、做不到什么」说清,比宣称「绝对安全」可信。
消费乱序与数据量:MQTT 本身有 QoS 分级(0 至多一次、1 至少一次、2 恰好一次),但顺序不跨 topic 保证。业务上防乱序的做法:消息体带设备侧单调递增序号或采集时间戳,消费端维护「每个设备的最新序号」,收到更旧的直接丢弃或入迟到缓冲区;需要严格顺序的场景按设备 id 分区,同一设备的消息进同一分区单线程消费。另外要处理时钟不同步——设备时间不可全信,服务端收到时补一个服务端时间。数据量估算要能给出量级(设备数 × 采样频率 × 单条大小),并说明存储策略(原始数据保留时长、降采样后长期留存)。
知识库回答的引用正确性:三个动作。一是约束生成:只允许依据检索到的片段作答,并在输出里带片段 id。二是校验引用:生成后逐条比对「这句话的论断」与「引用片段」是否真的支持,用规则(关键实体/数字必须出现在片段里)+ 模型双重检查,不通过就重写或降级为「未找到依据」。三是数据源治理:文档版本、更新时间、失效内容要能下架,否则检索到对的片段也是过时的答案。还要承认边界:多跳推理和跨文档汇总天然更容易错,应该在界面上提示「仅供参考,请核对原文」。
CAN 协议:CAN 是差分总线(CAN_H/CAN_L),多主竞争、基于优先级的仲裁(ID 越小优先级越高),有 CRC 校验与自动重传,适合车载与机器人内部的总线通信。数据帧最多 8 字节(CAN FD 到 64 字节),所以上层通常自己定应用层协议(分帧、序号、校验)。机器人比赛中常见的是 CAN 连电机驱动器(伺服、轮毂电机)、RS485/串口连传感器、主控之间用以太网或 WiFi。讲的时候最好能说到「为什么选它」:抗干扰、实时性、布线简单、驱动器生态成熟。
数据链路的可优化点:这是开放题,答得好不好看有没有「量化意识」。可以从四个角度讲:采集侧(采样率是否过高、能否边缘预处理降数据量)、传输侧(批量上报 vs 逐条、断网缓存与补传、压缩)、存储侧(冷热分离、降采样归档、时序库替代关系库)、消费侧(背压、幂等、乱序处理)。最好挑一个真做过的小优化并给出前后对比。