FluxMQ:新一代的高性能MQTT代理服务器

FluxMQ:新一代的高性能MQTT代理服务器

前言

FLuxMQ是一款基于java开发,支持无限设备连接的云原生分布式物联网接入平台。FluxMQ基于Netty开发,底层采用Reactor3反应堆模型,具备低延迟,高吞吐量,千万、亿级别设备连接;方便企业快速构建其物联网平台与应用。

FluxMQ官网:https://www.fluxmq.com

FluxMQ演示系统:http://demo.fluxmq.com/

丰富的功能

通配符

通配符解释
#可以匹配零个或多个层级的主题。只能出现在主题末尾。
+可以匹配一个层级的主题。可以出现在主题的任何位置。

FluxMQ支持两种通配符:+和#。+表示匹配一个层级,#表示匹配零个或多个层级。下面是一些例子:

  • 井号 #:

井号通配符表示可以匹配零个或多个层级的主题。它只能出现在主题的末尾,例如 home/living_room/#。
用法示例:如果一个订阅者订阅了主题 home/living_room/#,那么它将接收到诸如 home/living_room/light、home/living_room/temperature 等所有以 home/living_room/ 开头的消息。

  • 加号 +:

加号通配符表示可以匹配一个层级的主题。它可以出现在主题的任何位置,例如 home/+/light。
用法示例:如果一个订阅者订阅了主题 home/+/light,那么它将接收到诸如 home/living_room/light、home/kitchen/light 等层级为 home/ 下,且以 /light 结尾的消息。

共享订阅

FluxMQ支持共享订阅,单个topic共享订阅集群支持10W/s吞吐量,下面吗我们介绍下共享订阅的使用方式:

如何使用共享订阅
  • 通过Topic的订阅规则,可以指定订阅组名称,从而实现共享订阅。例如,订阅规则为$share/topic1,则订阅组名称为DEFAULT,订阅主题为topic1
  • 分组共享订阅是指将订阅组的消息分发均匀地分发给订阅组成员。在分组共享订阅中,订阅同一主题的客户机依次接收此主题下的消息。同一消息不会发送给多个订阅客户端,从而实现多个订阅客户端之间的负载均衡。订阅的规则为$queue/group1/topic1,则订阅组名称为group1,订阅主题为topic1

规则引擎

FluxMQ Rule Engine (以下简称规则引擎) 用于配置FluxMQ 消息流与设备事件的处理、响应规则。规则引擎不仅提供了清晰、灵活的 “配置式” 的业务集成方案,简化了业务开发流程,提升用户易用性,降低业务系统与 FluxMQ 的耦合度;也为 FluxMQ 的私有功能定制提供了一个更优秀的基础架构。
FluxMQ 在 消息发布或事件触发 时将触发规则引擎,满足触发条件的规则将执行各自的 SQL 语句筛选并处理消息和事件的上下文信息;

流程图

Sql支持

规则的 SQL 语句基本格式为:

SELECT <字段名> FROM <事件类型> [WHERE <条件>]
  • FROM 子句将规则挂载到某个事件类型上,可多选
  • SELECT 子句用于对数据进行变换,并选择出需要的字段
  • WHERE 子句用于对 SELECT 选择出来的某个字段施加条件过滤
## SELECT 语句用于决定最终的输出结果里的字段。比如:
## 下面 SQL 的输出结果中将只有两个字段 "a" 和 "b":SELECT a, b FROM "$EVENT.PUBLISH"# 选取 username 为 'abc' 的建立连接消息,输出结果为所有可用字段:SELECT * FROM "$EVENT.CONNECT" WHERE auth.username = 'abc'## 选取 clientId 为 'abc' 的终端发来的消息,输出结果将只有 cid 一个字段。SELECT clientId as cid FROM "$EVENT.PUBLISH" WHERE clientId = 'abc'## 选取 qos 为 '1' 的发布消息,输出结果将只有 cid 一个字段。
## 注意虽然 SELECT 语句中只选取了 cid 一个字段,所有消息发布事件中的可用字段 (比如 clientId、topic 等) 仍然可以在 WHERE 语句中使用:SELECT clientId as cid FROM "$EVENT.PUBLISH" WHERE qos = 1## 但下面这个 SQL 语句就不能工作了,因为变量 xyz 不是消息发布事件中的可用字段:SELECT clientId as cid FROM "$EVENT.PUBLISH" WHERE xyz = 'abc'

比较符号

函数名函数作用返回值
>大于true/false
<小于true/false
<=小于等于true/false
>=大于等于true/false
<>不等于true/false
!=不等于true/false
=比较两者是否完全相等。可用于比较变量和主题true/false
=~比较主题(topic)是否能够匹配到主题过滤器(topic filter)。只能用于主题匹配true/false

SQL 语句示例

基本语法举例

  • 从 topic 为 “t/a” 的消息中提取所有字段:
SELECT * FROM "$EVENT.PUBLISH" WHERE topic = 't/a'
  • 从 topic 为 “t/a” “t/b” 的消息中提取所有字段:
SELECT * FROM "$EVENT.PUBLISH" WHERE topic = 't/a' or topic = 't/b'
  • 从 topic 能够匹配到 ‘t/#’ 的消息中提取所有字段。
SELECT * FROM "$EVENT.PUBLISH" WHERE topic =~ "t/#"
  • 从 topic 能够匹配到 ‘t/#’ 的消息中提取 qos、messageId 和 clientId 字段:
SELECT qos, messageId, clientId FROM "$EVENT.PUBLISH" WHERE topic =~ "t/#"
  • 从 建立连接 消息中提取 username 字段,并且筛选条件为 username = ‘fluxmq’:
select auth.username as username from "$EVENT.CONNECT" where auth.username = 'fluxmq'
  • 从任意 topic 的 JSON 消息体(payload) 中 提取 x 字段,并创建别名 x 以便在 WHERE 子句中使用。WHERE 子句限定条件为 x = 1。下面这个 SQL 语句可以匹配到消息体 {“x”: 1},但不能匹配到消息体 {“x”: 2}:
SELECT payload.x as x FROM "$EVENT.PUBLISH" WHERE payload.x = 1
  • 类似于上面的 SQL 语句,但 **嵌套地提取 **消息体中的数据,下面的 SQL 语句可以匹配到 JSON 消息体 {“x”: {“y”: 1}}:
SELECT payload FROM "$EVENT.PUBLISH" WHERE payload.x.y = 1
  • 在 clientId = ‘c1’ 连接成功时,提取其来源 IP 地址:
SELECT clientIp FROM "$EVENT.CONNECT" WHERE clientId = 'c1'
  • 筛选所有订阅 ‘t/#’ 主题 订阅级别为 QoS 1 的 clientId:
SELECT clientId FROM "$EVENT.SUBSCRIBE" WHERE topic =~ 't/#' and qos = 1
  • 筛选所有订阅主题能匹配到 ‘t/#’ 且订阅级别为 QoS 1 的 clientId。注意与上例不同的是,这里用的是主题匹配操作符 ‘=~’,所以会匹配订阅 ‘t’ 或 ‘t/+/a’ 的订阅事件:
SELECT clientId FROM "$EVENT.SUBSCRIBE" WHERE topic =~ 't/#' and qos = 1
  • 从topic包含"fluxmq"字符的消息中提取所有字段,使用 ‘like’ 语法,包含的字符用%包裹:
SELECT * FROM "$EVENT.PUBLISH" WHERE topic like '%fluxmq%'
  • 使用常量字段,用双引号""包裹字符串,作为常量值;as后面跟字段,作为输出的字段名:
SELECT *, "test" as event FROM "$EVENT.PUBLISH"
  • 可以直接使用Java的String API,如 startsWith,endsWith;获取以’test’开头的所有Publish消息:
select * from "$EVENT.PUBLISH" where topic.startsWith('test')

提示

  • FROM 子句后面的主题需要用双引号 “”,或者单引号 ‘’ 引起来。
  • WHERE 子句后面接筛选条件,如果使用到字符串需要用单引号 ‘’ 引起来。
  • FROM 子句里如有多个事件,需要用逗号 “,” 分隔。例如 SELECT * FROM “t/1”, “t/2” 。
  • 可以使用使用 “.” 符号对json字段进行嵌套选择。
  • 尽量不要给 payload 创建别名,否则会影响运行性能。即尽量不要这么写:SELECT payload as p

SQL函数列表

函数名说明
json- 使用在SQL语句中,可以将嵌套的Json结构转换成字符串
- 使用在支持模板替换的想象中,比如数据库保存的SQL,KAFKA的TOPIC等地方
bytes将对象转成字节数组,会先将对象JSON化,再转成UTF8格式的字节数组
int8将对象转为Int8类型,相当于byte
int16将对象转为Int16类型,相当于short
int32将对象转为Int32类型,相当于int
int64将对象转为Int64类型,相当于long
toDouble将对象转为double类型
hexStr将对象转成HEX字符串, 会先将对象JSON化,再转成对象的16进制字符串
date格式化时间字符串:yyyy-MM-dd
datetime格式化时间字符串:yyyy-MM-dd HH:mm:ss
dateToTimestampyyyy-MM-dd 时间字符串转成时间戳
datetimeToTimestampyyyy-MM-dd HH:mm:ss 时间字符串转成时间戳
uuid生成32位随机小写字符串
uuidUpper生成32位随机大写字符串
isBytes判断是否是字节数组
isJson判断是否是json

SQL事件

规则的 SQL 语句可以处理事件(发布消息、客户端上下线、客户端订阅等),FROM 子句后面跟事件主题。
事件主题以 $EVENT/ 开头,比如 E V E N T . P U B L I S H , EVENT.PUBLISH, EVENT.PUBLISH,EVENT.SUBSCRIBE 。

事件名称事件主题名释义
发布事件$EVENT.PUBLISH发布消息
订阅事件$EVENT.SUBSCRIBE订阅成功消息
取消订阅事件$EVENT.UNSUBSCRIBE取消订阅成功消息
发布回复事件$EVENT.ACK消息接收成功并回复
心跳事件$EVENT.PING连接保活心跳消息
取消连接事件$EVENT.DISCONNECT客户端主动断开连接
连接断开事件$EVENT.CLOSE服务端关闭连接
建立连接事件$EVENT.CONNECT连接成功
离线消息事件$EVENT.OFFLINE离线期间接收的消息
支持的数据源
  • [✔] MySQL
  • [✔] PostgreSQL
  • [✔] Oracle
  • [✔] SQL Server
  • [✔] Redis
  • [✔] TDengine
  • [✔] ClickHourse
  • [✔] Kafka
  • [✔] RabbitMQ
  • [✔] RocketMQ
  • [✔] Pulsar
  • [✔] MQTT
  • [✔] Mogodb
  • [✔] Log

多协议

目前已经支持的协议如下:

  • [✔] Websocket
  • [✔] Ocpp
  • [✔] GBT32960
  • [✔] JT808
  • [✔] V2C
  • [✔] I1
  • [✔] Coap

通过控制台启动协议插件后,默认会在集群每个节点气动对应的协议插件,依托于FluxMQ,该协议天然支持集群,订阅的规则如下:

下行指令通过MQTT下发给具体的设备,TOPIC规则为:{协议名称}/down/{vin}
上行是设备上报的报文,TOPIC规则为:{协议名称}/up/{vin}

脚本

脚本的处理时机是在MQTT事件处理器之前,因此脚本的适用于修改、解析、加解密MQTT传输的Payload。脚本默认匹配主题支持通配符,处理Payload可以直接返回byte[]或者String。

Javascript脚本
 function convert(topic, payload){return payload;}
Lua脚本
function convert(topic, payload)return payload
end
Groovy脚本
def convert(String topic, byte[] payload){return payload
}

FluxMQ免费推广

FluxMQ默认提供免费的接入License许可,直接参考我们文档下载即可。

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

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

相关文章

二、Gradle 与 Idea 整合

这里写自定义目录标题 1、Groovy简介2、Groovy 安装3、创建 Groovy 项目4、Groovy 基本语法5、在 idea 中创建普通 java 工程 1、Groovy简介 详细了解请参考&#xff1a;http://www.groovy-lang.org/documentation.html 2、Groovy 安装 下载后解压到本地 验证&#xff1a; …

2024美赛数学建模A题思路源码——七鳃鳗性别比例和生态系统关系

赛题目的:分析一个物种根据资源可用性改变其性别比例的能力的利弊。开发一个模型,分析对生态系统中由此产生的相互作用。 问题一.七鳃鳗性别比例对生态系统的影响 问题分析 建立一个简化版的模型,来探讨以下问题: 1.我们假设七鳃鳗种群的增长遵循Logistic生长模型,其中食…

(学习日记)2024.02.01:引用变量 / 默认实参 / 一元作用域运算符 / 函数重载

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【ChatGPT】文本向量化与余弦相似度:揭开文本处理的神秘面纱(5)

1、引言 在这个数字化的时代&#xff0c;我们每天都会面对大量的文本信息&#xff0c;从社交媒体到新闻报道&#xff0c;文本无处不在。但是&#xff0c;计算机要如何理解和处理这些文字呢&#xff1f;本文将为大家揭开其中的一些奥秘&#xff0c;详细解释文本向量化的概念&am…

postgresql|数据库|pg_repack插件的部署和使用

一&#xff0c; 表和索引的膨胀现象 Postgres SQL 实现的MVCC的机制不同于 oracle &#xff0c; mysql innodb 的 undo tablespace 的机制。 表上所用的更新和删除等操作的行为&#xff0c;都不会实际的删除或修改&#xff0c;而是标记为死元祖 &#xff08;dead rows or dead…

3D应用开发平台HOOPS Platforms优化制造流程和数字化转型

Tech Soft 3D公司的HOOPS Platform &#xff08;包括HOOPS Native Platform 和HOOPS Web Platform&#xff09;&#xff0c;是一种用于开发顶级3D软件的集成技术。具有高性能3D图形&#xff0c;准确&#xff0c;快速的CAD数据转换&#xff0c;3D数据发布以及与流行的建模内核的…

微分几何——梅向明第四版学习笔记(一) 向量函数和曲线论

目录 引出向量函数曲线论简单曲线定义曲线的向量参数表示 曲线的切线【重要】曲线的法面【重要】曲线的自然参数表示 空间曲线曲线的密切平面空间曲线的基本三棱形【重要】单位切向量主法向量副法向量Frenet标架螺旋线的案例 曲线的曲率和曲率半径曲率的几何意义 曲线的挠率挠率…

玻璃钢制品三维扫描机械抄数全尺寸检测服务对比测量检查重合度

玻璃钢制品是一种广泛应用于建筑、汽车、航空航天等领域的复合材料。其制作过程中&#xff0c;需要确保每个环节的精确度&#xff0c;以确保最终产品的质量和性能。为了实现这一目标&#xff0c;三维扫描仪在玻璃钢制品的生产过程中发挥着至关重要的作用。 CASAIM中科广电高精度…

2024美赛数学建模A题思路分析 - 资源可用性和性别比例

1 赛题 问题A&#xff1a;资源可用性和性别比例 虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。例…

BC1.2 SDP/CDP/DCP介绍

参考&#xff1a;文章链接 Microchip Lightning Support 问题 Q1.) 在Microchip产品的数据表中提到了电池充电技术&#xff0c;但以下术语是什么意思: BC1.2? SDP? CDP? DCP? “SE1”? Q2.) 如何配置Microchip Hub以启用这些功能&#xff1f; Q3.) 如何在我的硬件上物…

基于QPSO-LSTM的短期风电负荷MATLAB预测程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献 基于QPSO-LSTM的短期风电负荷预测模型——谭才兴&#xff08;完全复现&#xff09; 程序简介 传统的LSTM神经网络超参数和拓扑结构通常是基于经验和试验确定&#xff0c;但这种方法容易受到人为因…

学习嵌入式第十五天之结构体

用变量a给出下面的定义 a) 一个整型数&#xff08;An integer&#xff09; //int a;b) 一个指向整型数的指针&#xff08;A pointer to an integer&#xff09; //int *a;c) 一个指向指针的的指针&#xff0c;它指向的指针是指向一个整型数&#xff08;A pointer to a poin…

Leetcode—2950. 可整除子串的数量【中等】Plus(前缀和题型)

2024每日刷题&#xff08;一零八&#xff09; Leetcode—2950. 可整除子串的数量 算法思想 让 f ( c ) d , 其中 d 1 , 2 , . . . , 9 f(c) d, 其中d 1, 2, ..., 9 f(c)d,其中d1,2,...,9. // f(c1) f(c2) ... f(ck) / k avg // > f(c1) f(c2) ... f(ck) - …

[opencvsharp]C#基于Fast算法实现角点检测

角点检测算法有很多&#xff0c;比如Harris角点检测、Shi-Tomas算法、sift算法、SURF算法、ORB算法、BRIEF算法、Fast算法等&#xff0c;今天我们使用C#的opencvsharp库实现Fast角点检测 【算法介绍】 fast算法 Fast(全称Features from accelerated segment test)是一种用于角…

Docker 集群配置

1、配置 MySQL MySQL 简单安装 docker安装完MySQL并run出容器后&#xff0c;建议请先修改完字符集编码后再新建mysql库-表-插数据 docker run -d -p 2222:3306 --privilegedtrue -e MYSQL_ROOT_PASSWORD123456 \ -v /opt/mysql/log:/var/log/mysql \ -v /opt/mysql/data:/va…

Spring:JDBCTemplate 的源码分析

一&#xff1a;JdbcTemplate的简介 JdbcTemplate 是 Spring Template设置模式中的一员。类似的还有 TransactionTemplate、 MongoTemplate 等。通过 JdbcTemplate 我们可以使得 Spring 访问数据库的过程简单化。 二&#xff1a;执行SQL语句的方法 1&#xff1a;在JdbcTempla…

前端性能优化:Vue项目打包后app.xxx.js 和 chunk-vendors.xxx.js 文件太大,导致页面加载时间太长

问题场景&#xff0c;如下图&#xff0c;环境上的 app.js 和chunk-vendors.js 两个文件大小&#xff0c;高达3.4M 和 2M &#xff0c;加载所耗费的时间也很长。 下面说一下如何解决&#xff1a; 1、首先需要安装插件 compression-webpack-plugin&#xff0c;我这里用的是6.1.1…

情人节送什么礼给男朋友合适?适合送男友的礼物合集

情人节即将来临&#xff0c;作为贴心的女友&#xff0c;你是否已经开始为男友精心挑选礼物了呢&#xff1f;为了让这个特殊的日子充满温馨与甜蜜&#xff0c;选择一份既实用又充满心意的礼物是至关重要的&#xff0c;下面为大家推荐一些适合在情人节送给男友的好物&#xff0c;…

探索自然语言处理在改善搜索引擎、语音助手和机器翻译中的应用

文章目录 每日一句正能量前言文本分析语音识别机器翻译语义分析自然语言生成情感分析后记 每日一句正能量 努力学习&#xff0c;勤奋工作&#xff0c;让青春更加光彩。 前言 自然语言处理&#xff08;NLP&#xff09;是人工智能领域中与人类语言相关的重要研究方向&#xff0c…

腾讯主导制定全球首个车载小程序国际标准,助力车载应用生态发展

2024年1月&#xff0c;国际电信联盟标准部门&#xff08;ITU-T&#xff09;正式发布了由腾讯主导制定的《F.749.8 In-vehicle multimedia applets: Framework and functional requirements》(车载多媒体小程序框架和技术需求)国际标准。 这是全球首个由中国企业主导制定的车载小…