跳转到内容

数据处理流程

Aether 使用请求驱动的数据处理路径。 DataProcessingApplication 组装一个完整的、有时间限制的 ProcessingFrame 并将其发送到选定的 DataProcessor。处理器永远不会收到站点标识符,然后回调 SHM、历史记录或配置来发现其输入。 数据请求处理器;处理器不请求Aether数据。

此路径在设备数据解码和发布后开始。它保留在 SHM 写入路径、历史持久性、规则和警报热路径以及命令传递之外。版本 1 提供经过身份验证的 HTTP 查询;未来计划的规划周期必须使用相同的边界。其故障无法停止设备轮询、实时状态发布、确定性保护、警报或现有控制行为。

Caller: authenticated HTTP / in-process application work
DataProcessingApplication
│ resolve task, binding,
│ processor policy, as_of
┌────────┼───────────────┐
│ │ │
▼ ▼ ▼
HistoryQuery LiveState CovariateSource
historical current SHM weather / calendar /
observations Last-only schedule / tariff
live tail
│ │ │
└────────┼───────────────┘
ProcessingFrame assembler
align / aggregate / validate /
quality-policy / digest
▼ complete, bounded request
DataProcessor
本地算法 / 模型伴生服务 /
远程服务
ProcessingResult validation
authenticated HTTP response
│ future separate use case
planner
│ constraints and policy
ControlApplication → SHM + UDS → IO

上面的路径是查询和派生数据路径。较低的控制路径仅在单独的应用程序决策后开始。 DataProcessor 没有引用 LiveStateWriter、操作调度程序、警报生命周期、计划程序或协议适配器。

调用者选择启用的 DataProcessingTask,而不是任意站点点、处理器 URL 或模型文件。请求至少标识:

  • 任务和任务契约版本;
  • 任务运行的委托绑定;
  • 调用者/请求上下文和有限的截止日期;
  • 稳定的 as_of 时间戳;
  • 特定于任务的参数,例如预测范围;
  • 特定于任务的类型化选项。处理器路由和工件策略是根据委托配置解析的,从未由调用者选择。

as_of 冻结帧的事件时间削减。比剪辑更新的历史和实时观察被排除在外。外部预测或时间表记录了该版本可用的版本。这可以防止这些来源跨越其声明的时间界限;它不是API重播保证,也不是使用当前历史记录和工件元数据的泄漏安全离线回测证明。

应用程序会解析整个请求的一个配置修订:任务架构、站点绑定、单位和符号规则、时间策略、质量限制、处理器和出口策略不能在框架组装过程中途更改。配置遵循 aether sync 之后的正常Aether路径;运行时服务不会直接解析行业包的 YAML。

HistoryQuery为其绑定观察字段提供任务的有界回顾窗口。它是一种领域能力,而不是数据库抽象。 DataProcessingApplicationDataProcessor 既看不到 SQL 也看不到特定于存储的系列键。

默认生产适配器以只读/仅查询模式延迟打开现有的 aether-history.db。它不会创建或迁移历史数据库模式。一个逻辑请求中读取的每个功能共享一个 SQLite 事务,因此共享一个快照。对于节奏 c,历史标签以 as_of 结束;标签 t 使用该功能的委托聚合和重复策略减少 (t-c, t] 中的原始观察结果。空存储桶仍然丢失,源水印是参与的最新数字原始行,而不是 t

aether-history 独自拥有架构迁移、写入、保留和文件生命周期。查询适配器依赖于 SQLite 快照/WAL 语义和读取权限。如果文件暂时不存在或无法访问,则只有处理请求变为类型不可用;它的惰性阅读器可能会在稍后的调用中恢复。外部历史学家并没有被默默地取代。

生产权限必须使该所有权具有物理性:API 接收专用的只读历史数据库/WAL/SHM 目录或只读身份,与其可写配置/审核数据库分开。基本共享 /app/data:rw 装载上的 SQLite 只读标志不提供该边界。

读取事务是请求运行时数据库的快照,而不是历史 as_of 中数据库包含的内容的快照。行缺少摄取时间和源/配置纪元。因此,具有旧事件时间戳的后期更正可能会出现在稍后的重播中,并且隐藏在同一逻辑 (series_key, point_id) 后面的物理重映射可以连接旧的和新的源纪元。预期的任务/绑定修订仅保护当前配置;他们无法过滤历史行中缺少的元数据。使用冻结数据库/导出进行离线评估,或在声明时间点再现性之前添加双时态、带有纪元的 HistoryQuery

运行时的 SQLite 权限防护会将路由与持久的 history_config.storage_* 进行比较。这些设置已保存意图:PUT /hisApi/storage 不会重新连接活动写入器。将任何存储更改视为维护边界 — 禁用处理、重新连接或重新启动历史记录、验证预期的哨兵系列,然后重新启动 aether-api — 这样读取器就不会加入到与活动写入路径不同的配置路径。

可选的 HTTP 历史记录适配器仅适用于已实现精确节奏网格的环回上游。它支持 last/reject,而不是原始聚合。处理器永远不会接收数据库或历史API访问权限。

持久历史记录可以按照采样或刷新间隔滞后当前设备值。 DataProcessingApplication 通过只读 LiveState 端口仅读取任务所需的点,并且可以替换显式映射特征的相应最终区间单元。部分活尾仅改变那些映射的细胞;不相关的历史特征保留其存储值和出处。

仅当该特征的委托历史聚合为 Last 时才有效。瞬时 SHM 值无法表示 MeanSumMinMax 存储桶,因此 v1 拒绝这些策略的 live_tail: true。能源负载和 PV 任务均使用 Mean 作为目标,因此禁止实时拖尾。

SHM 对于当前 T/S 状态仍然具有权威性。实时读取不是第二个历史记录,仅提供可用的当前样本及其源时间戳。帧组装器:

  1. 拒绝未写入的、非有限的、未来的或超龄的实时值;
  2. 仅将接受的样本映射到该特征的最终间隔结束单元格;
  3. 遵循任务的明确重叠源权威规则,而不是任意的最后写入者获胜行为;
  4. 记录最终间隔是否来自历史、实时状态或两者;
  5. 保留缺失而不是默默地替换零。

处理器不映射 SHM、了解插槽或写入器生成或接收 LiveStateWriter。这将共享内存 ABI 保留在 Aether 内部,并保留 IO 对 T/S 写入的独占所有权。

当前的 SHM 桥标签接受有限实时值作为 good;它不保留设备来源的样本质量。同样,当前的 SQLite 历史模式存储没有源质量的数值观察结果。版本 1 强制执行新鲜度、间隙、缺失、数字限制、出处和发布时间,但需要端到端设备质量的部署必须提供承载质量的源适配器。

某些任务需要的数据不是设备观察的数据。预测可以使用未来天气、日历字段、关税、已知设定点或生产计划。配置的 CovariateSource 仅返回任务声明的字段。

每个协变量都包含事件时间和源出处。预测的协变量还带有发布时间或版本,因此程序集选择 as_of 可用的预测,而不是稍后更正的预测。这仅关闭了协变量-年份边界;历史和模型工件切割具有上述单独的限制。可以使用任务声明的时区策略在本地生成确定性日历字段。

必填字段和可选字段是明确的。如果缺少所需的协变量,则框架不可用,除非任务声明特定的后备。过时的值不会仅仅因为处理器接受数字而被静默前向填充。

应用程序将特定于源的示例组装到一个与处理器无关的ProcessingFrame中。概念预测框架如下所示:

{
"schema": "aether.processing-frame.v1",
"as_of": "2026-07-11T12:00:00Z",
"cadence_seconds": 900,
"history": {
"timestamps": ["2026-07-11T11:45:00Z", "2026-07-11T12:00:00Z"],
"features": {
"load": {
"value_type": "number",
"unit": "kW",
"values": [820.0, 835.0],
"quality": ["good", "good"]
}
}
},
"future_covariates": {
"timestamps": ["2026-07-11T12:15:00Z", "2026-07-11T12:30:00Z"],
"features": {
"temperature": {
"value_type": "number",
"unit": "Cel",
"values": [32.1, 32.0],
"quality": ["good", "good"]
}
}
},
"static_features": {},
"quality": {
"input_watermark": "2026-07-11T11:59:58Z",
"missing_ratio": 0.0,
"max_gap_seconds": 900,
"live_tail_included": false,
"substituted_samples": 0
},
"provenance": [
{
"segment": "history",
"feature": "load",
"source_kind": "history",
"source_ref": "energy.site.load.active_power",
"watermark": "2026-07-11T11:59:58Z"
}
]
}

有线编解码器可以是 JSON、CBOR 或其他版本化表示;语义契约保持不变。命名的类型化字段使 Aether 独立于私有算法或张量名称,并使请求在离线一致性测试夹具中可检查和使用。

Aether 端应用程序拥有与站点数据语义相关的工作:

  • 解析实例和点绑定;
  • 以 UTC 排序时间戳并应用声明的本地时间策略;
  • 验证委托的单位、比例、偏移量、点种类和目标符号已与任务匹配(v1 不执行运行时单位/符号转换);
  • 应用任务声明的聚合和重采样规则;
  • 将字段与公共时间网格对齐并保留缺失掩码;
  • 检查回溯、新鲜度、倾斜、间隙和完整性要求;
  • 派生由任务声明的与处理器无关的字段任务;
  • 记录源水印和出处。

处理器拥有与其实现或工件相关的工作:

  • 选择配置的算法或允许的模型工件;
  • 为该实现排序命名字段;
  • 特定于算法的变换、缩放和张量构造;
  • 执行确定性库、本地模型、或远程端点;
  • 逆变换输出并报告实现来源。

这种分割使设备和点语义远离处理器,并使私有算法表示远离 Aether 内核。

验证后,应用程序根据版本化任务标识、版本化绑定标识、处理器合约、可选工件选择器、规范化帧(包括 as_of)和类型化选项计算规范输入摘要。处理器端点、请求 ID、提交时间和截止日期不是摘要输入。因此,对完全相同的标准化受控内容的独立调用具有相同的摘要;仅重复 as_of 并不能确保源可变时的内容。版本 1 不使用摘要进行重播或重复数据删除。

工件选择器的版本和摘要标识所使用的字节。版本 1 不包含工件 trained_throughavailable_at,因此为旧 as_of 选择当前固定模型仍可能会导致模型复古泄漏。历史模型评估必须使用外部冻结的工件注册/剪切,直到该元数据成为调试和验证的一部分。

DataProcessingApplication 通过 DataProcessor 端口发送完整的帧、输入摘要、请求 ID、截止日期、类型化输出协定和处理器选择策略。适配器可以调用:

  • 进程内确定性算法;
  • 同一边缘主机上伴生服务中的模型端点;
  • 单独监督的本地处理服务;
  • 显式配置的远程处理API。

模型端点只是一个请求驱动的处理器。它接收请求中指定的观察结果和协变量,并且可能拥有模型工件、特征排序、缩放、张量构造和执行。它不会接收 plant_id,然后查询 InfluxDB、Aether 历史记录、SHM 或站点配置。

所有处理器位置都实现相同的端口并接收相同的受控帧。位置不会更改数据权限或授予对任意Aether状态的访问权限。

调用受到有效负载、并发性和截止时间限制的限制。 data_processing.process 是非幂等的:v1 没有重播存储或重复数据删除合约,另一个调用可能会再次执行处理器工作。调用者仅在其自己的有限策略下重试类型化的可重试失败,并具有新的截止日期并意识到早期工作可能已经运行。

对于远程处理器,出口策略是适配器选择的一部分。只有任务声明的帧字段和所需的相关元数据离开主机;凭证、无关点、内部存储标识符和控制能力则不然。

传输成功并不会使处理器输出可信。 DataProcessingApplication 验证通用 ProcessingResult 信封及其任务类型处理器输出。只有这样,Aether 才会为消费者标记 DerivedData

常见检查包括:

  • 支持的结果契约版本;
  • 匹配请求 ID、任务 ID、绑定修订版和输入摘要;
  • 选定的处理器和工件身份、版本和摘要;
  • 有限数字输出和预期工程单位;
  • 预期输出形状、时间戳计数和严格排序的时间轴;
  • 特定于任务的范围和一致性约束;
  • 问题时间、处理器出处、质量和有限的到期时间;
  • 显式的 producedfallbackunavailable 状态。

对于预测,验证还需要请求的未来范围内的时间戳和正确排序的置信度边界或分位数(如果存在)。

仅当任务允许指定的回退并且结果标识它时,处理器才可以返回回退数据。经批准的持久性预测可以在质量下降的情况下使用;异常后生成的零填充数组无法报告为成功的预测。无效输出会拒绝整个结果,而不是将部分可信值泄露给消费者。

版本 1 直接从经过验证的 POST /api/v1/data-processing/process 路由返回经过验证的 DerivedData。它不实现结果缓存、重播存储、持久派生数据接收器、CLI 绑定或 MCP 工具。只有在定义了权限、保留和副作用策略之后,这些才是可能的单独功能。

DerivedData 不会进入 IO 拥有的 T/S 时隙或伪装为测量点。 HTTP消费者仍然可以看到其出处、质量摘要和有效期。

以下切换保留所有权:

v1 中仅实现经过身份验证的 HTTP 响应。其他行是对未来可能的使用方的约束,而不是当前的集成。

来自数据处理 使用方 允许切换 不允许
预测或估计 经过身份验证的 HTTP 调用者 返回类型化的派生数据和来源 暴露任意源数据或处理器机密
检测分数 警报应用程序 提交类型化观察以进行警报策略评估 在处理器内创建、确认或清除警报
预先计算的结果快照 未来确定性规则或调度程序 读取热路径中没有网络 I/O 的经过验证的未过期数据 在规则执行期间同步调用远程处理器
预测或其他派生数据 未来规划器/优化器 用作一个有限质量规划输入 将结果视为设备命令
未来的建议操作planner ControlApplication 正常重新授权、约束、确认、审核和调度 绕过控制策略,因为处理器生成输入

因此自动控制使用单独的序列:

future scheduled planning cycle
DataProcessingApplication.process
│ validated, unexpired DerivedData
planner / optimizer / deterministic policy
│ proposed actions
safety constraints + permission + confirmation + audit
ControlApplication
existing SHM + UDS command path → aether-io → device

当处理不可用时,规划周期要么使用显式配置的确定性回退,要么跳过该周期。当设备重新连接时,它不会继续过期的计划或重播过时的命令。采集、不依赖于派生数据的规则、警报和安全行为仍在继续。

人工智能可以解释输入水印、缺失、处理器/工件版本、回退和过期,因为这些事实都在结果契约中。它无法获得从 DerivedData 到 SHM 或设备的路由。

故障预计发生在边缘,并具有确定性、可观察的结果。

故障 所需行为
未知、已禁用或不兼容的任务/绑定 在读取数据或调用之前拒绝处理器
历史记录不可用或水印太旧 将帧标记为不可用;仅使用任务声明的回退,不会发明观察
SHM不可用、未编写或陈旧 不要替换Redis、镜像或零;仅当任务明确允许仅历史输入时才继续
所需的协变量缺失或在as_of之后发出 拒绝帧或使用质量下降的命名协变量回退
间隙过大、时钟偏差或单位/符号不匹配 在帧验证期间拒绝;不要要求处理器猜测
处理器截止时间、断开连接、过载或电路开路 返回处理器不可用;绑定重试并保持采集/控制不受影响
处理器契约或工件不匹配 拒绝完整结果并显示不兼容性
NaN、无穷大、错误形状、错误时间戳或无效任务约束 拒绝完整结果作为无效处理器输出
处理器使用批准的后备 保留其名称和质量下降,以便消费者可以应用任务策略
规划无法获取可用的派生数据 跳过周期或运行批准的确定性回退;不分派过时的操作
AI 客户端断开连接 确定性边缘行为继续;数据处理不是在硬实时循环中

每次失败都会保留一个请求ID和机器可读的类别。可观察性可以记录源水印、缺失、持续时间、处理器运行状况、工件身份和验证原因,同时避免原始敏感帧有效负载,除非明确的保留策略允许。

raw protocol bytes
IO decode and canonical T/S publication
SHM live authority ──► history persistence/query
│ │
└──────────┬────────────┘
Aether Data Processing
bounded ProcessingFrame → DataProcessor
validated, expiring DerivedData
│ │ │
▼ ▼ ▼
query UI alarm policy planner
ControlApplication

批量 ETL、仓库、仪表板和任意 BI 查询位于此操作边缘路径之外。确定性规则和警报生命周期仍然有自己的应用。数据处理将受控观察与有限的派生结果连接起来;