规则
每条规则都代表了在 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 内的规则会相互影响。具体表现为:源自某个规则的背压(Backpressure)可能会向后传播,影响到共享源组件。共享流上的背压进而会影响到所有连接至该共享源的其他所有规则的性能和处理。另外,共享流规则中,source 部分不参与 checkpoint 计算。
规则流水线
多个规则可以通过指定 sink/源的联合点形成一个处理管道。例如,第一条规则在内存 sink 中产生结果,其他规则在其内存源中订阅该主题。除了一对内存 sink/源,用户还可以使用 mqtt 或其他 sink/源对来连接规则。