# 规则引擎

规则引擎是 EMQX 内置基于 SQL 的数据处理组件，搭配[数据集成](./data-bridges.md)无需编写代码即可实现一站式的 IoT 数据提取、过滤、转换、存储与处理，以加速应用集成和业务创新。

![image](./assets/rules/data-integration-arch.png)

## 规则的组成

规则描述了 **数据来源**、**数据处理过程**、**处理结果去向** 三个方面：

<img src="./assets/sql_process.png" alt="sql_process" style="zoom:67%;" />

- **数据来源**：规则的[数据源](./rule-sql-events-and-fields.md)可以是消息或事件，也可以是外部的数据系统 (Source)。规则通过 SQL 的 FROM 子句指定数据的来源；
- **数据处理过程**：规则通过 [SQL 语句](./rule-sql-syntax.md)和[函数](./rule-sql-builtin-functions.md)来描述数据的处理过程。SQL 的 WHERE 子句用于过滤数据，SELECT 子句以及 SQL 函数用于提取和转换数据；
- **处理结果去向**：规则可以定义一个或多个动作来处理 SQL 的输出结果。如果 SQL 执行通过，规则将按顺序执行相应的动作，比如将处理结果存储到数据库、或者重新发布到另一个 MQTT 主题等。支持的动作如下：
  - [消息重发布](./rule-get-started.md#添加消息重发布动作)：将结果发布到指定 MQTT 主题
  - [控制台输出](./rule-get-started.md#添加控制台输出动作)：将结果输出到控制台或日志中
  - [发送到各类 Sink](./data-bridges.md)：将结果发送到外部数据系统中，如 MQTT 服务，Kafka，PostgreSQL 等。

## 规则 SQL 示例

规则 SQL 用于指定规则的数据来源、定义数据处理过程等。下面给出了一个 SQL 语句的例子：

```SQL
SELECT
    payload.data as d
FROM
    "t/#"
WHERE
    clientid = 'foo'
```

在上述 SQL 语句里：

- 数据来源：主题为 `t/#` 的消息；
- 数据处理过程：如果发送消息的客户端 ID 为 `foo`，则从消息内容中选出 `data` 字段并赋值给新的变量 `d`。

::: tip
"." 语法要求数据必须是 JSON 或者 Map 类型，如果是其他数据类型，须要使用 SQL 函数做数据类型转换。
:::

关于规则的 SQL 语句格式和用法，详见 [SQL 手册](./rule-sql-syntax.md)。

## 规则的典型应用场景

- **动作监听**：智慧家庭智能门锁开发中，门锁会因为网络、电源故障、人为破坏等原因离线导致功能异常，使用规则配置监听离线事件向应用服务推送该故障信息，可以在接入层实现第一时间的故障检测的能力；
- **数据筛选**：车联网的卡车车队管理，车辆传感器采集并上报了大量运行数据，应用平台仅关注车速大于 40 km/h 时的数据，此场景下可以使用规则对消息进行条件过滤，向业务消息队列写入满足条件的数据；
- **消息路由**：智能计费应用中，终端设备通过不同主题区分业务类型，可通过配置规则将计费业务的消息接入计费消息队列并在消息抵达设备端后发送确认通知到业务系统，非计费信息接入其他消息队列，实现业务消息路由配置；
- **消息编解码**：其他公共协议 / 私有 TCP 协议接入、工控行业等应用场景下，可以通过规则的本地处理函数（可在 EMQX 上定制开发）做二进制 / 特殊格式消息体的编解码工作；亦可通过规则的消息路由将相关消息流向外部计算资源如函数计算进行处理（可由用户自行开发处理逻辑），将消息转为业务易于处理的 JSON 格式，简化项目集成难度、提升应用快速开发交付能力。

## 关键优势

EMQX 的规则引擎功能为用户带来以下好处：

**简化数据处理**

规则引擎的类 SQL 语法和流处理能力，使数据的过滤、转换和分发无需编写自定义代码或使用其他工具，从而实现简化。

**实时洞察和行动**

通过基于特定条件触发动作，规则引擎使用户能够获得实时洞察并采取适当行动。

**减少开发时间和精力**

规则引擎通过提供广泛的内置功能，简化了物联网应用开发，减少了编写自定义代码和维护工作的需要。

**可扩展性和可靠性**

规则引擎旨在处理高吞吐量和众多连接的设备，允许用户扩展其物联网解决方案，而不影响性能或可靠性。
