Skip to content

离线消息

该插件会在没有订阅者在线时持久化选定的 QoS 1/2 消息,并在之后有匹配的订阅者上线时将其重放。

支持的后端:

  • MySQL
  • Redis

配置

该插件通过标准的 EMQX 插件配置 API 进行配置:

PUT /api/v5/plugins/<name-vsn>/config

Schema 定义在 priv/config.hocon 中,包含针对 Redis 和 MySQL 的后端专属设置。

该插件仅在以下情况下持久化消息:

  • 发布的 QoS 大于 0
  • 主题匹配某个已配置的 message.topic_filter

构建与测试

在仓库根目录构建该插件:

bash
make

运行该插件的 Common Test 测试套件:

bash
make plugins/emqx_offline_messages-ct

数据库表结构

MySQL

sql
CREATE TABLE IF NOT EXISTS `mqtt_msg` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `msgid` varchar(64) DEFAULT NULL,
  `topic` varchar(180) NOT NULL,
  `sender` varchar(64) DEFAULT NULL,
  `qos` tinyint(1) NOT NULL DEFAULT '0',
  `retain` tinyint(1) DEFAULT NULL,
  `payload` blob,
  `arrived` datetime NOT NULL,
  PRIMARY KEY (`id`),
  INDEX topic_index(`topic`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8MB4;
sql
CREATE TABLE IF NOT EXISTS `mqtt_sub` (
  `clientid` varchar(64) NOT NULL,
  `topic` varchar(180) NOT NULL,
  `qos` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`clientid`, `topic`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8MB4;

Redis

Redis 在 mqtt:sub:*mqtt:msg:* 键空间下使用哈希(hash)和有序集合(sorted set)。

  • 订阅状态存储在以客户端 ID 为键的哈希中。
  • 消息负载存储在以消息 ID 为键的哈希中。
  • 主题索引存储在以主题为键的有序集合中。

下载

各 EMQX 版本对应的插件安装包:

EMQX 版本插件版本安装包
6.1.22.0.0emqx_offline_messages-2.0.0.tar.gz
6.1.32.0.0emqx_offline_messages-2.0.0.tar.gz