3. 整体架构设计:分层架构

好,咱们进入正题。设备监控系统,说白了就是一套「看住设备」的体系。你想想看,工厂里几百上千台设备,每台都在跑数据——温度、转速、振动、电流……这些数据怎么收?收了怎么传?传了怎么用?

我个人习惯,第一件事就是画分层图。把系统拆成五层:采集层、传输层、处理层、存储层、展示层。每一层各管各的事,互不干扰。这就像盖楼——地基、框架、水电、装修,各工种同时干,最后拼起来就行。

核心原则:分层不是目的,解耦才是。每一层只关心自己的输入和输出,不关心隔壁怎么实现的。

3.1 五层架构总览

先看一张整体图,我手绘的 SVG,帮你建立全局感。

展示层 Web仪表盘 · 移动端 · 大屏 · 告警通知 存储层 时序数据库 · 关系库 · 缓存 · 对象存储 处理层 流计算 · 规则引擎 · 告警判定 · 数据清洗 传输层 MQTT · Kafka · gRPC · 消息队列 采集层 传感器 · PLC · 边缘网关 · 协议适配 数据流向

这张图我画了好几个版本,最后选了这种「瀑布式」布局。为什么?因为数据从下往上流,逻辑清晰,新人一看就懂。你在做架构设计时,也建议先画这种图——画出来,思路就顺了。

3.2 各层职责与交互

3.2.1 采集层

这是最「接地气」的一层。传感器、PLC、边缘网关,都在这层干活。它们负责把物理世界的信号,变成数字世界的结构化数据。

我在项目中遇到过一个问题:某工厂的振动传感器,采集频率是 10kHz,但网关只支持 1kHz 的采样。结果高频振动全丢了,设备坏了都没发现。后来我们加了一层「自适应采样」——网关根据信号变化率动态调整频率。

避坑指南:采集层最容易踩的坑是「协议地狱」。Modbus、OPC UA、Profibus、CAN……每个设备都有自己的方言。我曾经在一个项目里对接了 17 种协议,最后写了个统一的协议适配器,才把问题解决。

采集层的核心输出:原始数据 + 时间戳 + 设备ID。就这三样,别整花里胡哨的。

3.2.2 传输层

数据从采集层出来,怎么送到后端?这就是传输层的活。说白了,就是「管道」。

我建议用 MQTT 做设备端到服务器的传输。为什么?因为 MQTT 是发布/订阅模式,设备只管发,服务器只管收,两者解耦。而且 MQTT 支持 QoS 级别,可以保证数据不丢。

但要注意:MQTT 不适合大数据量的批量传输。如果你要传视频流或高频波形,建议用 gRPC 或 WebSocket。

协议 适用场景 优点 缺点
MQTT 低频传感器数据 轻量、支持 QoS 不适合大包
Kafka 高吞吐日志/事件 持久化、可回溯 延迟稍高
gRPC 实时控制指令 双向流、低延迟 客户端较重

3.2.3 处理层

数据到了服务器,不能直接存——得先「洗一洗」。处理层干的就是这个活。

处理层要做三件事:

  • 数据清洗:去重、补全、过滤异常值。比如温度传感器突然跳了 200 度,明显是故障,要剔除。
  • 规则判定:温度超过 85 度就告警?转速低于阈值就停机?这些逻辑都在处理层。
  • 流计算:实时统计、滑动窗口聚合。比如过去 5 分钟的平均温度。

嗯,这里要注意:处理层最容易犯的错误是「逻辑耦合」。我曾经见过一个项目,告警规则直接写在采集脚本里——每次改规则都要重启设备,太痛苦了。后来我们抽了一个独立的规则引擎,用配置文件驱动,才算解脱。

3.2.4 存储层

处理完的数据,得找个地方存起来。存储层的设计,直接决定了系统的查询性能和扩展能力。

我个人的经验是:不要只用一种数据库。时序数据用 InfluxDB 或 TimescaleDB,元数据用 MySQL 或 PostgreSQL,缓存用 Redis,文件用对象存储。

关键点:存储层要支持「冷热分离」。最近 7 天的数据放热存储(SSD + 内存),历史数据放冷存储(HDD 或云存储)。这样既保证查询速度,又控制成本。

3.2.5 展示层

最后一层,是给用户看的。Web 仪表盘、移动端、大屏、告警通知……都归展示层管。

展示层的设计原则就一条:别让用户思考。数据要直观,图表要清晰,告警要醒目。我见过一些监控系统,满屏都是数字,用户根本不知道哪里出了问题。

我个人习惯用 Grafana 做仪表盘,配合自定义的告警通知。但如果你需要深度定制,还是得自己写前端。

3.3 架构设计原则

分层架构不是万能的,但遵循三个原则,能让你少走很多弯路。

3.3.1 解耦

每一层只通过接口通信,不直接依赖内部实现。比如采集层只管发数据,不管数据怎么存。传输层只管传数据,不管数据怎么处理。

解耦的好处是:改一层,不影响其他层。你想想看,如果采集层和存储层耦合在一起,换数据库就得改采集代码——太可怕了。

3.3.2 冗余

设备监控系统,最怕的就是「单点故障」。采集网关挂了怎么办?消息队列挂了怎么办?数据库挂了怎么办?

冗余不是浪费,是保险。我建议:

  • 采集层:双网关热备
  • 传输层:Kafka 集群 + 副本机制
  • 处理层:多实例部署 + 负载均衡
  • 存储层:主从复制 + 自动故障转移

注意:冗余不是越多越好。每增加一个副本,就多一份维护成本。我见过一个项目,Kafka 副本设了 5 个,结果磁盘空间直接爆了。一般 2~3 个副本就够了。

3.3.3 水平扩展

系统上线后,设备数量会增长。今天 100 台,明天 1000 台,后天 10000 台。架构必须支持水平扩展——加机器就能扛住。

水平扩展的关键在于:无状态。处理层的实例不能保存状态,所有状态都丢到存储层或缓存里。这样加实例时,新实例直接干活,不用迁移数据。

举个例子:告警判定服务,如果每个实例都维护一个「设备状态表」,那加实例时就得同步状态——麻烦。正确的做法是:状态存 Redis,实例只管读 Redis 做判定。

3.4 小结

这一章的内容,说白了就是一句话:分层、解耦、冗余、扩展。这八个字,是我做架构设计时的「心法口诀」。你把这个框架搭好了,后面的细节填充就水到渠成了。

对了,最后提一句:架构设计没有标准答案。我给你的这套分层,适合大多数设备监控场景。但如果你遇到特殊场景——比如超低功耗设备、卫星通信链路——该调整就调整。灵活一点,别死板。


公众号:蓝海资料掘金营,微信deep3321