# 规则

您可以在规则中添加动作（Action），以定义处理后的数据应如何处理。每条规则可以对应一个或多个动作，而动作需要配置已定义的连接器，也就是指定数据的发送目标。

## 添加动作

创建规则后，点击**新建规则**步骤页面上的**下一步**按钮，进入**新建动作**步骤页面。在**新建动作**步骤页面上，从**连接器**下拉框中选择相关联的连接器。该页面将根据所选的关联连接器类型显示不同的动作配置选项。有关动作配置的详细示例，请参见[添加重新发布动作](#添加重新发布动作)和[添加将数据转发到目标服务](#添加将数据转发到目标服务动作)的动作。

规则可以关联多个动作。当您点击**确认**完成动作创建后，将出现**成功创建新规则**弹窗。如果您想添加另一个动作，可以点击**继续**以进行操作并选择另一个连接器。例如，一个动作可以将数据转发给 Kafka，而另一个动作将数据发送到 HTTP 服务。

### 添加重新发布动作

以下步骤演示了如何添加一个动作，将从主题 `t/#` 接收的原始消息重新发布到另一个主题 `a/1`。

1. 从**使用连接器**下拉框中选择`重新发布`。

2. 配置以下设置：
   - **主题**：在本示例中设置为目标主题 `a/1`；
   - **QoS**：在本示例中设置为重新发布的消息的 QoS 为`0`；
   - **Retain**：设置是否将此消息作为保留消息转发，本教程中保持默认设置 `false`；
   - **Payload**：输入 `${payload}`，表示重新发布的消息将与原始消息具有相同的 payload，不进行任何修改。
   - **MQTT 5.0 消息属性**：点击切换开关以根据需要配置消息属性，允许您为重新发布的消息添加丰富的消息元数据描述。
     - **有效载荷指示器**：指示消息格式。值设置为 `false` 时，消息是未确定的字节，设置为 `true` 时，意味着消息体中的有效载荷是 UTF-8 编码的字符数据。这将有助于 MQTT 客户端或 MQTT 服务器可以更加有效的解析消息内容，而不用特意去对于消息体进行格式或类型的判断。
     - **消息过期时间**：输入一个值（以秒为单位）以指定消息应在经过一段时间后过期，并且如果未传递给预期的接收方，则被视为无效。
     - **内容类型**：指定重新发布消息中的载荷内容的类型或格式（MIME 类型），例如，`text/plain` 表示文本文件，`audio/aac` 表示音频文件，而 `application/json` 表示是一条 JSON 格式的应用消息。
     - **响应主题**：输入要将响应消息发布到的特定 MQTT 主题。例如，如果您希望将响应发送到名为"response/my_device"的主题，您应输入：`response/my_device`。
     - **对比数据**：输入一个唯一标识符或数据，以将响应消息与原始请求消息相关联。您可以输入唯一的请求标识符、事务 ID 或在您的应用程序上下文中有意义的任何其他信息。

3. 点击**确认**完成动作创建。
4. 在**成功创建新规则**弹窗中，点击**返回规则列表**以完成规则创建。

### 添加将数据转发到目标服务动作

您还可以添加动作，通过关联的连接器将处理结果转发到目标服务。在**新建动作**步骤页面上，从**连接器**下拉列表中选择目标连接器。有关动作配置的详细信息，请参见[将 MQTT 数据发送到 HTTP 服务](./http_server.md)、[将 MQTT 数据传输到 Apache Kafka](./kafka.md)，或各数据集成页面。

## 备选动作

::: tip 注意

备选动作功能仅适用于 EMQX 5.91 版本以及之后的专有版部署。

:::

您可以为任意一个动作配置一个或（最多）两个备选动作。当主动作在处理消息时发生失败时，这些备选动作将会被触发。通过配置备选动作，您可以将失败的消息转发到其他目标（如另一个输出动作或重发布动作），从而提升数据的可靠性和可观测性。

备选动作的典型用途包括：

- 将失败的消息转发到备用数据系统（例如另一个输出动作）；
- 将失败的消息重发布到监控主题，用于故障排查或告警通知；
- 在主动作发生临时故障时，减少消息丢失的风险。

### 主要特性

- 仅当主动作处理消息失败时，备选动作才会被触发。失败情形包括投递失败、缓冲区溢出、请求超时（TTL 到期）等。
- 无论其自身配置如何，所有备选动作始终以异步模式执行。
- 如果配置了两个备选动作，他们将会同时被触发，EMQX Cloud 不会逐个尝试，也不会在第一个成功后停止。
- 备选动作使用与主动作相同的缓冲机制，消息将在 TTL 到期前被多次尝试，或在缓冲溢出前排入队列。
- 备选动作**不会**递归触发新的备选动作：如果某个备选动作自身失败，即使它也配置了备选动作，也不会继续执行。
- 备选动作的执行不会影响主动作或其所属规则的运行统计数据，两者是相互独立的。
