EMS 架构设计
总体分层
现场感知层
电表 / 光伏 / 储能 / PCS / 负荷 / 环境传感器
|
v
边缘控制层
协议适配 -> 资源发现 -> 能力快照 -> 控制审计
|
v
平台数据层
业务库 / 实时缓存 / 原始时序 / 汇总报表 / 收益快照
|
v
经营应用层
能源驾驶舱 / 设备监控 / 告警中心 / 报表中心 / 电价管理
架构原则
- 现场自治:网络中断时边缘网关仍执行本地采集、保护和已配置控制器,云端恢复后补传数据。
- 业务与协议解耦:业务层只识别标准设备、指标和能力,不感知具体 Modbus 寄存器或厂商私有字段。
- 控制与分析隔离:控制链路优先保证低延迟和可审计,历史查询和报表批处理不得挤占控制资源。
- 时间是第一维度:绑定、价格、能力、报表和配置均有生效时间,历史计算不能套用当前状态。
- 失败显式化:离线、过期、缺失、估算和结果未知是正常业务状态,不能用空值或 0 隐藏。
逻辑组件
flowchart LR
UI[Vue 管理端/大屏] --> GW[Gateway]
GW --> AUTH[认证与权限]
GW --> EMS[EMS 业务服务]
EMS --> MYSQL[(MySQL 业务库)]
EMS --> REDIS[(Redis 快照/锁/缓存)]
EMS --> NFS[文件与导出]
EMS --> BE[慧知自研能源接入中台]
EMS --> RAW[(Raw InfluxDB)]
EMS --> AGG[(Aggregated InfluxDB)]
BE <--> EDGE[慧知自研边缘智能网关]
EDGE --> DEV[电表/光伏/PCS/BMS/负荷]
EMS --> JOB[同步/告警/报表/保留任务]
JOB --> MYSQL
JOB --> RAW
网关与认证层
负责统一路由、登录态、租户上下文、接口权限、跨域和通用限流。网关只完成粗粒度访问控制,EMS 服务必须继续校验公司、电站和设备数据范围。
EMS 业务服务
当前模块覆盖公司、电站、员工、设备、接入端点、慧知自研边缘智能网关、资源同步、设备编排、能力、控制、实时监控、历史数据、告警、电价、报表、补拉和运维状态。内部按领域服务拆分,避免一个“万能 Service”同时负责接入、计算和展示。
自研能源接入层
API 数据源通过 WebSocket JSON-RPC 管理边缘网关和资源组件;Raw Influx 是实时和原始历史的主要来源;Aggregated Influx 可作为大范围历史的优先数据源。三类连接配置属于同一个接入端点,但健康状态和故障处理相互独立。
核心设计
1. 资源与数据分层
业务数据保存资源身份、绑定、配置和任务状态;时序数据保存高频采样和多粒度汇总。两类数据通过资源 ID、设备 ID 和采样时间联结,不使用大字段将时序数据塞进业务表。
2. 控制器与设备状态机
设备创建和控制具有明确的状态机:PENDING 、PRECHECK 、DISPATCHING 、ACTIVE 、FAILED 、DISABLED。运行状态与任务状态分开,避免“配置下发成功”被误读为“现场功率已达标”。
3. 多租户与数据范围
请求经网关携带租户与用户身份,后端按“租户 -> 公司 -> 电站”的有效范围进行二次校验。所有列表、详情、统计、任务和控制接口都使用同一套范围规则。
4. 定时任务与可恢复性
实时同步、历史修复、报表物化、收益重算和数据保留均由独立任务执行。多实例部署时使用分布式锁,同一租户的任务不会重复计算。
当前调度链路覆盖分钟级实时同步、边缘网关心跳、5 分钟全量同步、历史同步、小时报表、告警评估、日/月/年报表、缺口修复、迟到数据修复和保留策略。每类任务必须记录执行批次、租户、处理范围、成功/失败数、游标和错误摘要。
领域边界
| 领域 | 核心职责 | 主要数据 |
|---|---|---|
| 组织权限 | 租户、公司、员工、角色和数据范围 | Company、Employee、UserScope |
| 站点资产 | 电站、地址、容量、视图和边缘网关归属 | Station、StationEdge、ViewNode |
| 接入编排 | 接入端点、边缘网关创建、资源组件 / App 同步 | 接入端点、边缘网关、资源组件、ProvisionTask |
| 设备模型 | 业务设备、层级、通道映射和绑定历史 | Device、Hierarchy、ChannelMapping、BindingHistory |
| 数据工程 | 快照、游标、5 分钟历史、补拉和保留 | MetricSnapshot、History5Min、SyncCursor、BackfillTask |
| 运维告警 | 规则、事件、通知配置和通知日志 | AlarmRule、AlarmEvent、NotifyLog |
| 经营分析 | 电价、应用关系、报表和同步任务 | PriceRule、PricePeriod、PriceApply、Report |
跨域写入优先通过应用服务或领域事件完成。例如设备绑定成功后发布资源变更事件,数据同步消费者刷新映射,报表消费者从下一个时间窗开始使用新归属。
一致性策略
业务库事务
公司、电站、设备、绑定和任务状态等强一致数据使用本地事务。唯一约束覆盖租户内编码、请求幂等键和有效绑定冲突。外部 JSON-RPC 调用不应长时间占用数据库事务。
外部系统最终一致
创建边缘网关、下发资源组件、读取 Influx 均属于外部操作,采用“任务记录 + 外部调用 + 回读验证 + 状态推进”模式。调用超时进入结果未知,补偿任务通过回读判断实际状态,不能直接重复下发。
缓存一致性
Redis 只承载可重建数据,如实时快照、权限缓存、短期幂等和分布式锁。业务主数据以 MySQL 为准;缓存失效时允许回源,不允许因为缓存丢失而丢失绑定或审计。
控制链路设计
sequenceDiagram
actor User as 用户
participant API as EMS Control API
participant DB as Command Store
participant BE as 慧知自研能源接入中台
participant 边缘网关 as 边缘网关/设备
participant Sync as 实时同步
User->>API: capability + parameters + requestNo
API->>API: 权限/在线/能力/范围/过期校验
API->>DB: 保存 ACCEPTED
API->>BE: edgeRpc
BE->>边缘网关: 转发命令
边缘网关-->>BE: ACK/错误
BE-->>API: JSON-RPC 结果
API->>DB: ACKED/REJECTED/UNKNOWN
Sync->>边缘网关: 后续采样
Sync->>DB: VERIFIED 或 VERIFY_TIMEOUT
同一资源的互斥命令应串行化;计划类命令带生效时间和过期时间;功率设定值必须结合设备最大充放电功率、SOC、工作模式和现场保护状态裁剪或拒绝。
高可用与降级
| 依赖故障 | 影响 | 降级策略 |
|---|---|---|
| 慧知自研能源接入中台不可用 | 边缘网关管理和远程控制不可用 | 禁止控制,保留最后状态并显示链路故障 |
| Raw Influx 不可用 | 实时/历史同步中断 | 快照标记过期,任务保留游标,恢复后补拉 |
| Aggregated Influx 不可用 | 大范围历史变慢 | 回退 Raw,并限制查询范围和并发 |
| Redis 不可用 | 缓存、锁和会话受影响 | 核心写操作保护性失败,查询按策略回源 |
| 邮件服务不可用 | 告警通知失败 | 事件仍入库,通知任务重试并记录失败 |
| 单个租户数据异常 | 该租户任务失败 | 隔离执行,不能阻断其他租户批次 |
可观测性
每次请求贯穿 requestId/traceId,外部 JSON-RPC 记录 endpoint、edge、method、耗时和结果码但不记录凭据。任务指标至少包括最近成功时间、执行耗时、扫描数、写入数、跳过数、失败数和积压窗口。
建议核心指标:
ems_realtime_sync_lag_secondsems_edge_online_total/ems_edge_offline_totalems_metric_stale_totalems_report_job_duration_secondsems_backfill_pending_totalems_control_result_total{status=...}ems_alarm_active_total{severity=...}ems_external_request_duration_seconds{system=backend|influx}
技术组件
| 组件 | 用途 |
|---|---|
| Gateway | 统一路由、鉴权、跨域与错误返回 |
| Nacos | 服务发现、环境配置与动态参数 |
| MySQL | 租户、公司、电站、设备、告警、任务与报表 |
| Redis | 会话、权限、实时快照、分布式锁与幂等计算 |
| 时序存储 | 高频采样、历史曲线、多粒度汇总 |
| ECharts | 能源流、趋势、排名、大屏可视化 |
云边协同与数据流
EMS 不直接访问现场 Modbus、MQTT 或串口设备。现场协议由慧知自研边缘智能网关适配,平台通过接入中台 WebSocket 获取资源镜像和控制结果,通过 Timedata/Influx 获取时序数据。
sequenceDiagram
participant 边缘网关 as 慧知自研边缘智能网关
participant 接入中台 as 慧知自研能源接入中台
participant EMS as EMS API
participant TS as 时序库
边缘网关->>接入中台: 心跳、资源、采样
接入中台->>TS: 原始/聚合时序写入
EMS->>接入中台: JSON-RPC 资源发现/控制预检
EMS->>TS: 按 edge、component、channel 查询
EMS->>EMS: 快照、告警、报表和收益计算
EMS-->>边缘网关: 经接入中台转发控制命令
资源标识与边界
一个测点的全局定位键为 endpointId + edgeId + componentId + channelId。业务表保存稳定的资源 ID,展示名称和设备型号属于可变属性;时序点必须同时写入 sampleTime、quality、source 和 ingestTime,不能仅依赖数据库写入时间。
状态机与一致性
资源编排任务使用 PENDING -> PRECHECK -> DISPATCHING -> VERIFYING -> ACTIVE,失败进入 FAILED;设备运行状态使用 ONLINE/OFFLINE/STALE/FAULT/DISABLED。下发成功只代表边缘网关接受请求,必须等待后续采样验证目标功率或模式。
可扩展性设计
- 能力驱动 UI:前端根据能力快照渲染控制项,新增设备类型不需要修改通用页面。
- 事件驱动解耦:资源同步、告警计算、报表物化通过领域事件解耦,事件带租户、资源、发生时间和幂等键。
- 读写分离:控制和配置走业务库,曲线与聚合走时序库,驾驶舱只读快照,避免大屏查询拖慢控制链路。
- 降级优先可见性:时序库不可用时保留最后快照并标记
STALE,控制链路不可用时禁止误操作。
容量基线
以 1,000 台设备、每台 10 个测点、10 秒采样估算,写入约 1,000 点/秒。生产部署应将采集、快照、聚合、报表拆分为独立消费者,并为每个租户设置查询时间窗和并发配额。容量压测至少覆盖 2 倍峰值写入、全天报表批量生成和 100 个并发大屏用户。
容量估算方法
每秒点数 = 在线设备数 × 每设备有效通道数 ÷ 采样周期秒数
每日点数 = 每秒点数 × 86,400
理论原始容量 = 每日点数 × 单点平均字节数 × 保留天数
实际容量还要乘以时序索引、标签基数、WAL、副本和压缩系数。tenantId、edgeId、componentId 等稳定低基数字段适合作为标签;SN、告警文本、请求号等高基数值不应直接成为时序标签。
技术决策记录
重要架构变更应形成 ADR,至少记录背景、选择、替代方案、影响和回滚方式。建议优先记录:功率方向、设备与资源组件的映射、历史归属规则、迟到窗口、数据质量门槛、收益版本策略和控制验证规则。
自研技术内核
慧知 EMS 采用“边缘自治 + 云端编排 + 数据资产化 + 经营智能化”的技术路线。边缘网关负责现场协议、实时采集和安全边界;云端平台负责资源治理、策略协同、数据建模、告警闭环和收益核算;数据层把高频采样沉淀为可复用指标资产。
| 技术内核 | 能力说明 | 差异化价值 |
|---|---|---|
| 边缘自治内核 | 本地采集、协议适配、控制周期和断网保护 | 网络波动不影响现场基础运行 |
| 资源编排内核 | 将边缘网关、资源组件、标准通道和能力快照统一治理 | 多厂家设备可规模化复制接入 |
| 时序治理内核 | 原始、快照、5 分钟、小时、日月年多层数据链 | 实时展示与经营报表互不拖累 |
| 策略控制内核 | 控制命令经过权限、能力、约束、互斥和验证 | 降低远程控制风险,提升可审计性 |
| 经营计算内核 | 电价、质量、时区、绑定版本和收益公式统一版本化 | 收益数字可复核、可重算、可归档 |
架构高级特性
- 领域化拆分:资源、数据、告警、报表、收益、控制各自有清晰边界,通过事件和版本衔接。
- 冷热链路分离:实时快照服务大屏和监控,历史时序服务趋势,物化报表服务经营分析。
- 多租户隔离:所有资源、任务、报表、告警和控制命令都携带租户边界,适合安装商托管多客户。
- 可恢复任务体系:同步、补拉、报表、收益和保留任务都具备幂等键、水位线和失败重跑能力。
- 可观测优先:接口、任务、外部依赖、数据新鲜度和控制结果均可指标化,便于生产运维。
