配置热更新/支持 Reload、QUIC 桥接再升级

news2024/11/15 13:44:18

12 月,NanoMQ 继续保持稳步更新,最新的 0.15 版本将于本月初发布。这一版本增加了配置热更新功能和 Reload 命令;MQTT over QUIC 桥接再次得到升级,增加了拥塞控制和 QoS 消息优先传输;另外也为上一个版本新增的 HOCON 配置文件做了多项安全性和功能修复,并为硬实时翼辉(SylixOS)操作系统推出了能够兼容运行的版本。

配置热更新

如果要在 NanoMQ 服务运行过程中修改运行参数而不影响已经连接的客户端,就需要使用热更新功能。由于 NanoMQ 为纯 C 语言开发,无内置运行时,所以热更新功能仅支持配置文件中部分标注为「Hot updatable」的字段,目的在于提供用户一种可以实时调整 Broker 服务运行参数的方法。以 HOCON 格式配置文件为例,可支持热更新的参数如下:

mqtt.session {
    # # Property_size
    # # The max size for a MQTT user property
    # # MQTT 5.0 消息中最大可携带的用户属性长度
    # # Hot updatable
    # # Value: 1-infinity
    property_size = 32
    
    # # The max packet size of NanoMQ (Kbytes)
    # # Defines the max size of a packet that NanoMQ could accept
    # # 最大可接收的MQTT报文长度,单位为字节
    # # Hot updatable
    # # Value: 1 Byte-260 Mb
    max_packet_size = 1024
    
    # # The default max packet size of each client (Kbytes)
    # # Defines the default max size limit of sending packet to each client
    # # Will be overwrite if client set its own max size limit
    # # 最大允许向客户端转发的MQTT报文长度,单位为字节
    # # Hot updatable
    # # Value: 1 Byte-260 Mb
    client_max_packet_size = 1024
    
    # # msq_len
    # # The queue length in-flight window
    # # This is essential for performance and memory consumption
    # # NanoMQ内置的缓冲飞行队列长度,影响内存消耗和消费能力不足时消息是否丢失。
    # # Hot updatable
    # # Value: 1-infinity
    msq_len = 2048
    
    # # qos_duration (s)
    # # The nano qos duration which also controls timer interval of each pipe
    # # 全局定时器颗粒度,单位为秒
    # # Hot updatable
    # # Value: 1-infinity
    qos_duration = 10s
    
    # # anonymous
    # # allow anonymous login
    # # 是否允许匿名登录
    # # Hot updatable
    # # Value: true | false
    allow_anonymous = true
}

HTTP 热更新

同时 NanoMQ 也支持使用 HTTP API 请求和命令行两种方式进行热更新,使用 HTTP 接口 + Basic 认证方式示例如下:

(此功能需要http server支持; 设置 http_server.enable=true)
$ curl --location --request POST 'http://localhost:8081/api/v4/reload' \
--header 'Authorization: Basic YWRtaW46cHVibGlj' \
--header 'Content-Type: application/json' \
--data-raw '{
    "data": {
        "data": {
                "property_size": 32,
                "max_packet_size": 1024,
                "client_max_packet_size": 1024,
                "msq_len": 4096,
                "qos_duration": 20,
                "keepalive_backoff": 1250,
                "allow_anonymous": true
        }
    }
}'

{
    "code": 0
}

修改完成后,可以使用查询基本配置的接口来验证是否修改成功。

```shell
$ curl --location --request GET 'http://127.0.0.1:8081/api/v4/configuration/basic' \
--header 'Authorization: Basic YWRtaW46cHVibGlj'

Reload 命令

也可以直接使用命令行工具来重载选定的配置文件,需要启动的时候开启 enable_ipc_internal=true,然后修改原配置文件或新的配置文件中支持热更新的参数,最后执行指令:

# 若修改的是原文件,可不带配置文件路径
$ nanomq reload 
# 若使用新的配置文件,需要带上配置文件路径
$ nanomq reload --conf /tmp/nanomq2.conf

MQTT over QUIC 桥接再升级

QUIC 桥接功能一经推出得到了热烈反响,许多用户都在各种复杂的弱网环境下尝试使用了该功能来完成数据到云端的上传同步。根据从各位用户和各种测试场景收集的数据,本次 NanoMQ 版本发布着重优化升级了 MQTT over QUIC 桥接功能在弱网环境下的表现,增加了拥塞控制算法的支持,并为 QoS 消息设置了更高的优先传输级别。

拥塞控制算法支持

每当网络环境突然变差,而消息上传的速率却并没有降低,上行数据通道就会发生拥塞。这时候如果还想保持连接,并且最大限度有效利用剩余的带宽,就需要拥塞控制算法出场了。拥塞控制是 TCP/QUIC 协议的一个基础部分,多年来经过一个个版本的迭代(如 Tahoe、Reno、Vegas 等),拥塞控制算法得到了持续的提升。本文不对算法做详细介绍,简而言之通过实时侦测和改变发送滑动窗口的大小来完成慢启动、拥塞避免、快速重传和快速恢复等功能,NanoMQ 的 QUIC 桥接功能依赖于 MsQUIC,目前支持的有比较流行的两种拥塞控制算法:CUBIC 和 BBR。一般使用中建议开启 BBR。开启方式很简单,只需在配置文件中打开即可:

bridges.mqtt {
    nodes = [
        {
            name = emqx
            enable = false
            connector {
                  ......
            }
            ......
            ## 此处设置 cubic/bbr 字符串来选择拥塞控制算法即可
            congestion_control = cubic
            subscription = [
                {
                    topic = "cmd/topic1"
                    qos = 1
                },
                {
                    topic = "cmd/topic2"
                    qos = 2
                }
            ]
            ......

QoS 消息优先级分级

由于 IoT 数据具有强烈的时空伴随特性,我们发现,在遇到网络突然变差时,用户往往希望优先保证一些重要的数据传输不受到影响,但可以接受一些普通的采集数据因为弱网而丢失。同时如果一条数据因为多次重传、拥塞排队或尝试过久而造成极大的消息延时,这样就算最终达到了云端,也会因为延时过大而失去了原有的价值,而只能被云端丢弃。这样既浪费了带宽,还影响了其他更有价值数据的传输。

针对这一情况,NanoMQ 特地在 QUIC 桥接模式上推出了 QoS 消息优先传输的功能,用户发布到桥接通道内的 QoS 1/2 级别的消息会先于 QoS 0 的数据被处理和调度,在传输 QoS 0 的消息时若发现拥塞队列过长,则不会再继续尝试将此消息入队待发送而是直接丢弃。如此最终就可达到让重要数据优先使用有限带宽的效果。

测试场景:

  1. 施加 2s 延迟 + 40% 丢包的网络参数
  2. 同时往 2 个桥接主题,以同样 50 条消息/s 的速率发送长度为 128 字节的 QoS 0 和 QoS 1 消息,各 2000 条。
  3. 在对端 Broker 以非弱网模式接收消息并记录最大延时

测试中 QUIC 连接都未发生重连。
1

可以发现,在使用优先级传输模式并开启用拥塞控制时,能保证 QoS 1 的消息得到优先传输。

为了适配更多的使用场景,我们为这三种模式都预留了配置选项。

其他优化

完善修复 HOCON 配置文件支持,并提高安全性

NanoMQ 0.14 版本引入 HOCON 配置文件后,继续对背后使用的纯 C 语言开发的 HOCON 解析器进行完善和提高安全性工作,通过模糊测试和使用 AFL 工具测试发现并修复了许多问题。欢迎用户试用这一小巧精简的 HOCON 解析库。

新增操作系统兼容支持

NanoMQ 自诞生之初就具备极强的可移植性和兼容性,现在兼容的操作系统列表上又新增了一个成员:翼辉(SylixOS)操作系统。

SylixOS 是一个嵌入式实时操作系统,支持 SMP 多核实时调度,可运行于多种 CPU 架构目标平台。具有卓越实时性和可靠性,提供丰富的功能,可为不同行业的嵌入式设备提供理想的软件开发平台。NanoMQ 响应基础软件国产化浪潮,也正式适配了其 2.1.6 版本。

针对 SylixOS 嵌入式系统,我们为 NanoMQ 和 NanoSDK 都移植了专用的版本,并且对基础的 MQTT Broker 功能都进行了完整测试,若您对在 SylixOS 上使用 NanoMQ 有兴趣,欢迎与我们联系。

问题修复

  1. 修复了 HOCON 格式配置文件中配置规则引起不生效的问题。
  2. 修复了若干使用 Reload 命令重载异常配置文件会导致服务中止的问题。
  3. 修复了使用 MQTT over QUIC 桥接时,在大量数据传输时网络突然断开可能造成的数据竞争问题。

即将到来

在一二月,NanoMQ 项目会继续提高 MQTT over QUIC 桥接的体验,通过引入 Multi-Stream 模式来实现各个主题数据的隔离调度。还会为 NanoMQ 加入 DDS 协议的转换网关,以支持用户将 DDS 的数据通过 NanoMQ 来完成跨域传输并通过 MQTT 和云端互通。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/nanomq-newsletter-202212

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2003-2021年高铁线路信息数据

2003-2021年高铁线路信息数据 1、时间:2003-2021年 2、指标: 高铁线路名称、起点名、终点名、开通时间、线路长度(km)、设计速度(km/h)、沿途主要车站 3、指标说明: 高铁一般指高速铁路。 高速铁路,简称高铁&…

基于 K8s 的 MySQL 数据持久化存储

目录一、步骤二、实践2.1 创建 PV 和 PVC2.2 部署 MySQL 服务2.3 创建测试数据2.4 模拟节点宕机2.5 数据一致性验证FAQ一、步骤 (1)创建 PV 和 PVC。 (2)部署 MySQL 服务。 (3)向 MySQL 添加数据。 &am…

什么是Vue、Vue开发的方式、Vue的基本指令

一、什么是Vue 1. 前端技术的发展(html、CSS、JavaScript) ​ (1)jQuery:是对JavaScript进行了封装,使得操作DOM、事件处理、动画处理、ajax交互变得非常简洁、方便。是JavaScript的库。 ​ &#xff08…

贴吧低代码高性能规则引擎设计

作者 | 贴吧UEG技术组 导读 本文首先介绍了规则引擎的使用场景,引出贴吧规则引擎。从组件、变量、规则、处置四个模块介绍了规则引擎的组成部分,同时对最终规则文件的编译过程做了详细介绍。为了做到低代码,在规则配置上做到平台化&#xff0…

2022第十一届中国创新创业大赛全国总决赛在深圳举办

为深入贯彻党的二十大精神和创新驱动发展战略,强化企业科技创新主体地位,支持企业融合创新,推进科技型创新型企业遴选和培育,加大金融对硬科技企业的支持力度,营造有利于科技型中小微企业成长的环境,推动创…

Nuxt.js

Nust.js介绍 Nust.js介绍 移动互联网的兴起促进了web前后端分离开发模式的发展,服务端只专注业务,前端只专注用户体验,前端大量运用的前端渲染技术,比如流行的vue.js、react框架都实现了功能强大的前端渲染。但是,对…

深入探索Linux虚拟化KVM-Qemu分析之CPU虚拟化

说明: KVM版本:5.9.1QEMU版本:5.0.0工具:Source Insight 3.5, Visio 1. 概述 本文围绕ARMv8 CPU的虚拟化展开;本文会结合Qemu KVM的代码分析,捋清楚上层到底层的脉络;本文会提供一…

MYSQL对千万级数据的快速迁移

MYSQL对千万级数据(10个G左右)的迁移,耗时控制在半小时内 1.show variables like %secure%;查看 secure-file-priv 当前的值是什么 2.如果没有可以在my.ini(windows)my.cnf(linux)中添加secure…

得物染色环境落地实践

1. 背景 测试环境治理一直是各大公司非常重要的一个课题,测试环境稳定性很大程度影响迭代开发&测试效率。 综合来看,测试环境不稳定的原因主要有以下几点: 测试环境的变更非终态变更,经常会有代码发布/配置发布导致服务无法…

ArcGIS基础实验操作100例--实验47融合相邻面要素

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验47 融合相邻面要素 目录 一、实验背景 二、实验数据 三、实验步骤 (1&am…

【Vue3】Vue内置指令

注意&#xff1a;在vue中使用v-开头的都是Vue指令。一、v-html插入标签可以识别标签。<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"&…

argparse简介

一、argparse简介 argparse 模块是 Python 内置的用于命令项选项与参数解析的模块&#xff0c;argparse 模块可以让人轻松编写用户友好的命令行接口&#xff0c;能够帮助程序员为模型定义参数。 argparse定义四个步骤 导入argparse包 ——import argparse创建一个命令行解析…

Fastjson反序列化审计及验证

简介&#xff1a;数字化平台已经与我们生活紧密结合&#xff0c;其用户规模庞大&#xff0c;一旦系统出现故障&#xff0c;势必会造成一定生活的不便。比如疫情时代&#xff0c;健康码已经成为人们出门必备的条件&#xff0c;一旦提供健康码服务平台出现故障&#xff0c;出行将…

imx6ull内核移植记录:failed to find ocotp node

前言 记录记录&#xff0c;是个和MAC地址相关的信息。 一 尝试尝试 [ 0.093958] vddsoc: supplied by regulator-dummy [ 0.126215] failed to find ocotp node [ 0.126744] No ATAGs? 经过分析&#xff0c;拆分为两个问题&#xff1a; [ 0.126215] failed t…

Web前端 CSS3 02 小练习

京东小项目 设置一个京东侧边栏 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&quo…

读 NebulaGraph源码 | 查询语句 LOOKUP 的一生

本文由社区用户 Milittle 供稿 LOOKUP 是图数据库 NebulaGraph 的一个查询语句。它依赖索引&#xff0c;可以查询点或者边的信息。在本文&#xff0c;我将着重从源码的角度解析一下 LOOKUP 语句的一生是如何度过的。 本文源码阅读基于内核源码的 v3.3.0 版本&#xff0c;详见 …

实现SQLSERVER 调用 C# 代码

简单例子 首先写一段简单的 C# 代码&#xff0c;然后把它编译成 dll。 namespace Bussiness {public class UserFunctions{public static string UserLogin(string username, string password){var random new Random();var isSuccess random.Next() % 2 0;return isSucce…

【漏洞复现】钉钉rce反弹shell

文章目录 一、漏洞描述二、漏洞原理三、影响版本四、复现过程0.环境说明1.msf 生成shellcode2.msf开启监听3.将生成的shellcode替换原shellcode4.开启web服务&#xff0c;并上传poc文件&#xff0c;构造poc5.从钉钉发送poc给受害者6.受害者点击即会触发漏洞&#xff0c;在msf监…

前端菜鸟如何快速开发个人产品

我是车辙&#xff0c;我的掘金小册《SkyWalking&#xff1a;应用监控和链路跟踪》已经上线啦&#xff0c;这是我的第一本电子书&#xff0c;欢迎大家订阅。 大家好&#xff0c;我是车辙。在完成小册后的一段时间&#xff0c;我突然想开发一款个人H5产品。在起初有这样想法的时候…

长、中、短视频“再战”微短剧

配图来自Canva可画 近年来&#xff0c;流量焦虑一直伴随着国内的视频平台&#xff0c;比如&#xff0c;制作精良的长视频由于剧集冗长正在被“追求效率”的年轻人抛弃&#xff1b;高歌猛进的短视频也因为无法承受太多有价值的内容而面临增长瓶颈。在此背景下&#xff0c;制作门…