主题重写

    EMQ X 的 和 延迟发布 可以与主题重写配合使用,例如,当用户想使用延迟发布功能,但不方便修改客户端发布的主题时,可以使用主题重写将相关主题重写为延迟发布的主题格式。

    主题重写功能由 内置模块提供, 此功能默认关闭,支持在 EMQ X Broker 运行期间动态启停,请参见 。

    EMQ X 的主题重写规则需要用户自行配置,用户可以自行添加多条主题重写规则,规则的数量没有限制,但由于任何携带主题的 MQTT 报文都需要匹配一遍重写规则,因此此功能在高吞吐场景下带来的性能损耗与规则数量是成正比的,用户需要谨慎地使用此功能。

    每条主题重写规则的格式如下:

    每条重写规则都由以空格分隔的主题过滤器、正则表达式、目标表达式三部分组成。在主题重写功能开启的前提下,EMQ X 在收到诸如 PUBLISH 报文等带有主题的 MQTT 报文时,将使用报文中的主题去依次匹配配置文件中规则的主题过滤器部分,一旦成功匹配,则使用正则表达式提取主题中的信息,然后替换至目标表达式以构成新的主题。

    目标表达式中可以使用 $N 这种格式的变量匹配正则表达中提取出来的元素,$N 的值为正则表达式中提取出来的第 N 个元素,比如 $1 即为正则表达式提取的第一个元素。

    需要注意的是,EMQ X 使用倒序读取配置文件中的重写规则,当一条主题可以同时匹配多条主题重写规则的主题过滤器时,EMQ X 仅会使用它匹配到的第一条规则进行重写,如果该条规则中的正则表达式与 MQTT 报文主题不匹配,则重写失败,不会再尝试使用其他的规则进行重写。因此用户在使用时需要谨慎的设计 MQTT 报文主题以及主题重写规则。

    假设 etc/emqx.conf 文件中已经添加了以下主题重写规则:

    1. module.rewrite.pub.rule.1 = x/# ^x/y/(.+)$ z/y/x/$1
    2. module.rewrite.pub.rule.2 = x/y/+ ^x/y/(\d+)$ z/y/$1
    • 当客户端订阅 主题时,y/def 不匹配任何一个主题过滤器,因此不执行主题重写,直接订阅 y/def 主题。

    • 当客户端向 x/1/2 主题发送消息时,x/1/2 匹配 x/# 主题过滤器,EMQ X 执行 规则,通过正则表达式未匹配到元素,不执行主题重写,因此直接向 x/1/2 主题发送消息。

    • 当客户端向 x/y/2 主题发送消息时,x/y/2 同时匹配 x/#x/y/+ 两个主题过滤器,EMQ X 通过倒序读取配置,所以优先匹配 module.rewrite.pub.rule.2,通过正则替换,实际向 z/y/2 主题发送消息。