NanoMQ Newsletter 2022-06|规则引擎正式发布 & NanoSDK 支持 MQTT over QUIC

简介: NanoMQ 继续保持稳步更新,0.9.0 将于 7 月初正式发布。此版本为大家带来了 2 个重要的功能更新:规则引擎和支持 QUIC 的 NanoSDK。

NanoMQ 继续保持稳步更新,0.9.0 将于 7 月初正式发布。此版本为大家带来了 2 个重要的功能更新:规则引擎和支持 QUIC 的 NanoSDK。同时还增加了离线数据缓存配置,各项性能优化和缺陷修复也在持续进行中。

轻便易用的嵌入式规则引擎

规则引擎是 EMQX 深受广大用户喜爱的一项功能,NanoMQ 也根据用户需求推出了相同的功能,用户现在可以方便地通过编写 SQL 规则对消息进行处理后重新发布或存入数据库进行持久化。

NanoMQ 的规则引擎由统一消息接口和各种不同目标插件组成,不同插件各自享有独立的配置文件。目前只有 SQLite 插件作为数据持久化选项,未来会增加更多的可选插件。

使用规则引擎需要先在全局配置/etc/nanomq_rule.conf 里开启 SQLite 插件功能:

## Rule engine option, when persistence with 
## rule engine, this option is must be ON.
## 
## Value: ON | OFF
rule_option=ON

## Rule engine plugins option
## Choose a plugin to enable
## 
## Value: enable/disable
rule_option.sqlite=enable

## Rule engine option database config path
## Rule engine plugin config path, default is exec path.
## 
## Value: File nanomq_rule_sqlite.conf
rule_option.sqlite.conf.path=/etc/nanomq_rule_sqlite.conf

然后再对应的插件配置文件 /etc/nanomq_rule_sqlite.conf中配置对应的 SQL 语句和数据库参数:

## Rule engine option SQLite3 database path
## Rule engine db path, default is exec path.
## 
## Value: File
rule.sqlite.path=/tmp/sqlite_rule.db

## Rule engine option SQLite3 database table name
## Rule engine db table name.
## 
## Value: String
rule.sqlite.table=broker

## Rule engine option sql
## Rule engine sql clause.
## 
## Value: String
SELECT * FROM "abc" WHERE payload.x.y = 10

如此配置,NanoMQ 就会使用配置中的 SQL 处理所有的 Publish 消息后持久化到对应的 SQLite 数据库表中。

例如此时我们发布两条不同的消息到 abc 主题:

msg1: "{"x": {"y": 10}, "z": "str1", "a": 1111}
msg2: "{"x": {"y": 11}, "z": "str1", "a": 1111}

然后就能在 SQLite 数据库中看到:

sqlite> SELECT * FROM Broker;
RowId|Qos|Id|Topic|Clientid|Username|Password|Timestamp|Payload
1|1|1|abc|nanomq-57a0d6ab|abc|(null)|1656066147|{"x": {"y": 10}, "z": "str1", "a": 1111}
2|1|1|abc|nanomq-9c1ca526|abc|(null)|1656066147|{"x": {"y": 10}, "z": "str1", "a": 1111}
3|1|1|abc|nanomq-7ff24b6f|abc|(null)|1656066147|{"x": {"y": 10}, "z": "str1", "a": 1111}
4|1|1|abc|nanomq-83e7ff63|abc|(null)|1656066147|{"x": {"y": 10}, "z": "str1", "a": 1111}

可见只有符合规则的消息 msg1 被持久化到了数据库中。规则引擎目前支持标准 JSON 解析和常用的 SQL 语句和符号,具体详情请参阅文档。

目前 NanoMQ 的规则引擎运行顺序是在处理完 MQTT 消息之后串行执行,如果规则耗时过多的话会影响 Broker 本身的性能和消息吞吐。如果有许多数据需要通过规则引擎进行持久化,建议将/etc/nanomq.conf中的 parallel=32 数量提高以增加逻辑线程数以支持更多规则和消息的并行处理。

边缘数据缓存配置

边缘服务往往运行在弱网或者恶劣环境中,断网断电的情况时常发生。在之前的版本中,NanoMQ 的桥接功能支持了将未收到确认的 QoS 1/2 消息缓存在本地 SQLite 中并自动重发来避免数据丢失。此次发布的 v0.9.0 增加了对桥接连接断开的处理,并且针对边缘场景增加了许多配置选项,以避免由于缓存的数据过大写满 Flash 或者写入次数过多导致 Flash 寿命耗尽。

/etc/nanomq_bridge.conf的新增配置选项有:

## Enable sqlite cache
## Whether to enable sqlite cache
## 是否开启SQLite离线消息缓存功能
## Value: boolean
bridge.sqlite.enable=false

## Max message limitation for caching
## ( 0 means ineffective )
## Value: 1-infinity
## 最大缓存到磁盘/Flash的消息条数限制
bridge.sqlite.disk_cache_size=102400

## Mounted file path
## SQLite数据库文件路径
## Value: path
#bridge.sqlite.mounted_file_path=/tmp/

## The threshold of flushing messages to flash.
## flush msg to disk when reach this number
## Value: 1-infinity
## 数据刷盘的缓存窗口(消息条数),建议根据消息大小设置为 消息条数 * 消息大小 = page size
bridge.sqlite.flush_mem_threshold=100

## Resend interval (ms)
## The interval for resending the messages after failure recovered. (not related to trigger)
## 缓存消息的重发间隔
## Value: 1-infinity
bridge.sqlite.resend_interval=5000

同时 0.9.0 版本也不再需要用户自行修改编译参数来启用 SQLite,现在可以通过配置文件控制 Broker 和桥接功能是否启用 SQLite 作为缓存选项。另外我们也对 SQLite 的使用做了优化,开启了 WAL 模式,并采用了全同步方式避免文件系统损坏。而且从这一个版本开始,桥接的离线缓存功能配置选项和 Broker 的 QoS 消息默认缓存分离,建议只需要对云端桥接进行断网数据自动缓存和续传的用户不用开启 /etc/nanomq.conf 的 SQLite 功能。

NanoSDK: 首个 C 语言的 MQTT over QUIC SDK

6 月 11 日,IETF 正式颁布了 HTTP/3 RFC 技术标准文档,QUIC 正式成为了传输层标准之一。IoT 应用经常会遇到诸如网络漫游、弱网环境频繁重连和网络拥塞等问题,利用 QUIC 的流式多路复用、分路流控、更低的连接建立延迟等特性,这些问题都可以得到显著改善。NanoSDK 0.6.0 基于 MsQuic 项目率先实现了 C 语言的第一个 MQTT over QUIC SDK。建议搭配全球首个支持 MQTT over QUIC 的 Broker——EMQX 5.0 一同使用。

NanoSDK 与 EMQX 之间通过 QUIC 进行消息收发.png

NanoSDK 与 EMQX 之间通过 QUIC 进行消息收发

NanoSDK 通过为 NNG 的传输层增加 QUIC 支持,使 MQTT、nanomsg 等协议能够从 TCP 转为 UDP,从而提供更好的物联网连接体验。其内部将 QUIC Stream 和 MQTT 连接映射绑定,并内置实现了 0RTT 快速握手重连功能。

QUIC: 0RTT 快速重连.png

QUIC: 0RTT 快速重连

API 方面保持了之前的使用习惯,一行代码即可基于 QUIC 创建 MQTT 客户端:

## Create MQTT over Quic client with NanoSDK
nng_mqtt_quic_client_open(&socket, url);

消息示例代码请参考:

https://github.com/nanomq/NanoSDK/tree/main/demo/quic ,编译后可以通过以下命令连接 EMQX 5.0 的 14567 端口进行测试。

quic_client sub/pub mqtt-quic://54.75.171.11:14567 topic msg

其他功能优化及 Bug 修复

此外,NanoMQ 0.9.0 还有如下 bug 修复和更新优化:

  1. 增加了最大接收消息长度和最大可转发消息长度的配置选项,方便进行大消息收发。
  2. 修复了nanomq broker restart重启命令不生效的情况。
  3. 取消了对 C++ compiler 的编译要求。
  4. 修复了收到客户端 Disconnect 消息不会清理会话和遗愿消息的问题。
  5. 修复了 v0.8.0 中 MQTT over WebSocket 服务无法正常工作的问题。
  6. 修复了客户端 unsub 会导致服务停止的问题。
  7. 修复了客户端大量发布消息导致积压时,Sub 客户端突然端断开导致的数据竞争问题。

即将到来

NanoMQ 将于下个月正式发布 0.10 stable release 版本,并支持 MQTT 多路桥接功能。目前此功能处于 Demo 阶段,在最新的主分支已可以使用。用户可以自行编译安装使用,欢迎尝鲜:https://github.com/emqx/nanomq/

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
EMQ
|
Kubernetes Cloud Native 物联网
在 Kubernetes 上体验 EMQX 5.0 的 MQTT over QUIC 特性
本文将介绍如何在 Kubernetes 上部署 EMQX 集群并开启 MQTT over QUIC 功能。
EMQ
151 0
在 Kubernetes 上体验 EMQX 5.0 的 MQTT over QUIC 特性
EMQ
|
监控 安全 数据可视化
EMQX Enterprise 5.1 正式发布:生产环境就绪的 MQTT over QUIC、基于 MQTT 的文件传输支持
EMQX Enterprise 5.1 单集群可达 1 亿客户端连接;创新性地引入 MQTT over QUIC 协议;同时提供了 MQTT 大文件传输能力以及可视化数据集成能力。
EMQ
257 0
EMQX Enterprise 5.1 正式发布:生产环境就绪的 MQTT over QUIC、基于 MQTT 的文件传输支持
EMQ
|
网络协议 物联网 Java
从零开始上手 MQTT over QUIC:快速体验下一代物联网标准协议
为了更多用户能体验到MQTT over QUIC为物联网消息传输带来的提升,我们将通过本文指导您如何从零开始上手使用MQTT over QUIC。
EMQ
633 15
从零开始上手 MQTT over QUIC:快速体验下一代物联网标准协议
EMQ
|
传感器 边缘计算 Cloud Native
Mosquitto vs NanoMQ | 2023 MQTT Broker 对比
Mosquitto与NanoMQ都很适用于工业物联网和嵌入式设备等资源受限的场景。本文将从功能、性能、技术细节和应用场景等方面对这两款MQTT Broker进行详细的对比分析。
EMQ
414 0
EMQ
|
消息中间件 SQL 监控
EMQX vs NanoMQ | 2023 MQTT Broker 对比
EMQX和NanoMQ是当前活跃的两个开源MQTT Broker项目,本文将对EMQX和NanoMQ进行详细的对比分析,以帮助读者进行选择。
EMQ
712 0
EMQ
|
SQL 缓存 网络协议
更强大的 MQTT over QUIC 桥接 & Azure 桥接
十月,NanoMQ保持稳步更新,最新的0.13版本将于近日发布:此版本聚焦于桥接功能,并新增了规则引擎消息重发布功能。
EMQ
177 0
更强大的 MQTT over QUIC 桥接 & Azure 桥接
EMQ
|
JavaScript 物联网 Linux
MQTT X Newsletter 2022-08 | v1.8.2 发布、支持使用 Docker
八月,MQTT X团队发布了1.8.2版本:新增了使用Docker来安装和部署MQTT X CLI与MQTT X Web,同时MQTT X Web支持了更多的MQTT 5.0属性配置。
EMQ
305 0
MQTT X Newsletter 2022-08 | v1.8.2 发布、支持使用 Docker
|
25天前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
66 6
|
19天前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
23天前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!