2. 系统架构设计:分层架构、微服务与单体、高可用设计原则
好,咱们进入正题。这一章聊的是系统架构,说白了就是整个储能监控运维体系的骨架。骨架搭不好,后面功能再多也白搭。我这些年见过太多项目,前期图省事搞了个大泥球架构,后期改一个功能牵一发动全身,运维同学天天半夜被告警电话叫醒。
所以这一章,我会把分层架构、微服务与单体的选型、高可用设计原则,掰开揉碎了讲清楚。嗯,咱们开始。
2.1 分层架构:四层模型详解
储能监控系统,我习惯把它拆成四层:感知层、网络层、平台层、应用层。每一层各司其职,层与层之间通过标准接口通信。这样做的好处是,哪一层出了问题,只影响那一层,不会把整个系统拖垮。
核心原则:上层依赖下层,下层不依赖上层。下层为上层提供能力,上层调用下层的结果。
2.1.1 感知层
这一层是系统的「眼睛和耳朵」。说白了,就是各种传感器、电表、BMS(电池管理系统)、PCS(储能变流器)等硬件设备。它们负责采集电压、电流、温度、SOC(荷电状态)等原始数据。
我在项目中遇到过一个问题:某厂商的BMS上报的SOC值,在低温环境下会跳变。如果感知层不做数据预处理,直接把原始数据往上送,平台层做策略控制时就会误判。所以,感知层最好做一层简单的数据清洗和滤波。
避坑指南:我曾经因为感知层没有做数据有效性校验,导致一条异常数据(比如电压突变为0V)直接触发了保护停机。后来我强制要求:感知层必须做「数据合理性判断」,比如电压值是否在0.5V~5V范围内,超出则标记为无效。
2.1.2 网络层
网络层负责把感知层的数据,安全、可靠地传到平台层。常见的通信方式有:4G/5G、以太网、RS485、CAN总线等。这里有个关键点:储能站通常部署在偏远地区,网络不稳定是常态。
我个人习惯在网络层做两件事:一是数据缓存,网络断了数据不丢;二是断点续传,网络恢复后自动补传。你想想看,如果因为网络抖动丢了一天的数据,那运维分析还有什么意义?
2.1.3 平台层
平台层是系统的「大脑」。它负责数据存储、计算、分析、告警、策略下发等核心功能。这一层通常部署在云端或本地服务器上。
这里要注意:平台层不能是「黑盒」。我见过一些系统,平台层处理逻辑不透明,出了问题只能重启。我建议平台层要有完整的日志链路,每一步处理都能追溯。
2.1.4 应用层
应用层是系统的「脸面」。它面向运维人员、管理人员、甚至终端用户。包括Web界面、手机App、大屏展示等。这一层要关注的是:交互体验、数据可视化、权限管理。
嗯,这里有个小技巧:应用层不要直接查询数据库,而是通过平台层提供的API接口获取数据。这样即使应用层挂了,平台层还能继续运行,不影响数据采集和告警。
分层架构的核心价值:每一层都可以独立演进、独立部署、独立扩缩容。比如感知层换了新设备,只要接口协议不变,上层完全无感知。
2.2 微服务与单体架构选型
这是很多团队纠结的问题。我直接说结论:没有银弹,只有适合。
2.2.1 单体架构
单体架构就是把所有功能打包成一个应用。优点是开发简单、部署方便、调试容易。适合小规模项目、团队人数少、业务逻辑不复杂的场景。
但单体架构有个致命问题:牵一发而动全身。我曾经维护过一个单体系统,改一个告警阈值配置,结果把整个数据上报模块搞崩了。因为所有代码都在一个进程里,内存泄漏、线程阻塞都会互相影响。
2.2.2 微服务架构
微服务架构把系统拆成多个独立服务,每个服务负责一个业务领域。比如:数据采集服务、告警服务、策略控制服务、报表服务等。服务之间通过REST API或消息队列通信。
微服务的优势很明显:独立部署、独立扩缩容、技术栈可以不同。比如告警服务可以用Go写,追求高性能;报表服务可以用Python写,方便数据分析。
注意:微服务不是免费的午餐。它带来了分布式事务、服务发现、配置管理、链路追踪等复杂性。如果团队没有足够的DevOps能力,建议先从单体架构开始,等业务复杂到单体扛不住了,再逐步拆分。
2.2.3 我的选型建议
| 场景 | 推荐架构 | 原因 |
|---|---|---|
| 小型储能站(<5MW) | 单体架构 | 设备少、数据量小、团队小 |
| 中型储能站(5-50MW) | 模块化单体 | 按功能模块分包,为后续拆分做准备 |
| 大型储能站(>50MW)或集群 | 微服务架构 | 高并发、高可用、多团队协作 |
个人经验:我建议从「模块化单体」起步。就是把代码按功能拆成独立的包或模块,但部署时还是一个进程。这样既保留了单体的简单性,又为未来拆微服务留了后路。我上一个项目就是这么干的,后来拆微服务时,只花了两周就完成了。
2.3 高可用设计原则
储能监控系统,说白了就是不能停。一旦系统挂了,电池过充、过放、温度失控,后果很严重。所以高可用是硬性要求。
2.3.1 冗余设计
关键组件必须冗余。比如:数据库主从、服务多副本、网络双链路。我习惯用「N+1」原则:实际需要N个实例,就部署N+1个,多出来的那个用于故障切换。
2.3.2 故障自动转移
光有冗余还不够,还得能自动切换。比如数据库主库挂了,从库要能自动升为主库。服务实例挂了,负载均衡器要能自动剔除故障节点。
我曾经遇到过一个案例:数据库主库宕机了,但运维人员正在休假,没人手动切换。结果系统停了4个小时。后来我强制要求:所有关键组件必须配置自动故障转移,并且每季度做一次故障演练。
2.3.3 限流与熔断
当流量突增时,系统要有自我保护机制。比如:某个服务响应变慢,熔断器要能快速切断对该服务的调用,避免雪崩效应。
嗯,这里要注意:限流和熔断不是不处理请求,而是优雅地拒绝。比如返回一个「系统繁忙,请稍后重试」的提示,而不是直接超时或报错。
2.3.4 数据备份与恢复
数据是系统的生命线。我建议:全量备份每天一次,增量备份每小时一次。备份数据要异地存储,防止单点故障。
另外,恢复演练也很重要。我见过一个团队,备份做了三年,但从没恢复过。结果真出问题时,发现备份文件损坏了。所以,每月至少做一次恢复演练,确保备份可用。
高可用设计口诀:冗余是基础,自动是保障,限流是底线,备份是后手。
2.4 架构图:四层模型与微服务关系
下面这张图,是我自己画的。它展示了四层架构与微服务之间的关系。你可以看到,平台层内部拆成了多个微服务,每个服务独立部署、独立运行。
这张图里,平台层的微服务之间通过消息队列(比如Kafka)异步通信,避免同步调用带来的耦合。每个服务都有自己的数据库,数据通过事件驱动的方式同步。
一个小建议:微服务之间的通信,尽量用异步消息,少用同步RPC。同步调用一旦链路长了,任何一个节点慢都会拖垮整个请求。我吃过这个亏,后来全改成异步了,系统稳定性提升了一个量级。
2.5 本章小结
这一章我们聊了分层架构的四个层次、微服务与单体的选型策略、以及高可用的设计原则。说白了,架构设计就是做权衡:简单 vs 灵活、成本 vs 可靠性。没有标准答案,只有最适合你当前场景的方案。
嗯,记住一点:架构是演进的,不是一蹴而就的。先跑起来,再优化,别一开始就想着搞个大而全的完美架构。
公众号:蓝海资料掘金营,微信deep3321