Skip to content

规则 ​

每条规则都代表了在 eKuiper 中运行的一项计算工作。它定义了连续流数据源作为输入,计算逻辑和结果 sink 作为输出。

规则生命周期 ​

eKuiper 目前仅支持流处理规则(Streaming Rules)。这类规则要求其至少包含一个连续流(Continuous Stream)作为数据源。规则一旦启动,将持续运行,直到:

  • 用户明确发送停止命令。
  • 规则因内部错误或 eKuiper 实例退出而异常终止。

规则的启动过程是异步的。当用户发送启动命令后,eKuiper 在完成必要的静态检查后,会异步执行规则的启动操作。因此,用户收到的命令回复仅表示 eKuiper 已接受启动请求,并将规则的期望状态 (Expected Status) 设置为“启动”。这并不意味着规则已开始运行。用户需要进一步检查规则的运行时状态 (Runtime Status),以确认规则是否已成功启动和运行。

在规则更新过程中,eKuiper 提供了**错误回退(Error Rollback)**支持。如果更新后的新规则启动失败,系统将自动保持并继续运行原有的旧规则,确保服务的稳定性。

规则关系 ​

同时运行多个规则是很常见的。由于 eKuiper 是一个单一的实例进程,这些规则在同一个内存空间中运行。规则在运行时上是分开的,一个规则的错误不应该影响其他规则。关于工作负载,所有的规则都共享相同的硬件资源。每条规则可以指定算子缓冲区,以限制处理速度,避免占用所有资源。

使用共享流的多个规则之间共用 source 部分,包括数据接入和解码等,其拓扑结构如下图所示。实际运行中,共用共享流的所有规则组成一个可动态增减下游规则的 DAG。此时,规则之间会互相影响。某个规则的背压可能会导致共享流部分的背压,从而影响所有规则。

当多个规则使用共享流 时,它们会共享上游的源组件,包括数据的接入和解码等。在实际运行中,所有使用同一共享流的规则将组成一个有向无环图(Directed Acyclic Graph, DAG),在这个图中,下游规则可以动态地增加或移除。 由于这种共享结构,DAG 内的规则会相互影响。具体表现为:共享流配置 BUFFER_FULL_POLICY="block" 后,源自某个规则的背压(Backpressure)可能会向后传播,影响共享源组件及连接至该共享源的所有其他规则。停止订阅规则会解除订阅,并释放正在等待该规则通道的发送操作。

共享流规则中的 source 部分仍不参与 checkpoint 计算。因此,共享流的无损传递可以避免内存通道丢弃数据,但不会为共享 source 组件提供 checkpoint 或 source offset 恢复能力。

规则流水线 ​

多个规则可以通过指定 sink/源的联合点形成一个处理管道。例如,第一条规则在内存 sink 中产生结果,其他规则在其内存源中订阅该主题。除了一对内存 sink/源,用户还可以使用 mqtt 或其他 sink/源对来连接规则。

参考阅读 ​