掌桥专利:专业的专利平台
掌桥专利
首页

MQTT消息中心引入规则引擎的方法

文献发布时间:2023-06-19 09:38:30


MQTT消息中心引入规则引擎的方法

技术领域

本发明涉及MQTT传输协议技术领域,特别是一种MQTT消息中心引入规则引擎的方法。

背景技术

MQTT协议作为物联网的基本传输协议以来,经历了不同版本的演化,包括有(3.0/5.0)等。为了支持最新的MQTT传输协议,为了方便不同协议版本的设备连接,消息中心的功能和服务都需要扩展。

MQTT服务功能需要在原来的代码基础上进行必要的扩展和更新、重新设计框架、保持向下兼容。这将导致程序开发的成本的增加,也为整个系统的独立性和稳定性提出了挑战。每次添加了新的功能和服务,需进行完整的单元,集成,性能测试。且每次新功能的发布都必须导致关停服务,重启服务。对于有大量设备连接的消息服务系统而言,这种重启会导致客户使用体验下降,以及集群软硬件资源的巨大消耗。现今存在的消息中心规则引擎的方案很少,即使有也是JAVA+DROOLS的方式,这种方式仅支持XML、DRL文件格式,且加载需要大量的系统资源,这对于消息平台的实时性和大并发交互有困难。

发明内容

为解决现有技术中存在的问题,本发明的目的是提供一种MQTT消息中心引入规则引擎的方法,本发明使得系统的开发,维护和升级变得更容易。

为实现上述目的,本发明采用的技术方案是:一种MQTT消息中心引入规则引擎的方法,包括以下步骤:

S1、定义数据结构描述规则;

S2、将数据结构定义完成后,通过图形化界面添加和修改规则;

S3、设计规则加载方式;

S4、所有MQTT消息中心接收且转发的数据和event事件数据都会回调不同的插件hook,判断数据是否满足相应的规则条件并响应动作,如果有处理结果输出,规则将执行相应的动作。

作为本发明的进一步改进,在步骤S1中,定义四种数据类型构建SQL+JSON数据结构描述规则,四种数据类型包括:

①规则:包括采用SQL描述规则和采用JSON描述规则;

所述SQL描述规则由SQL语句和动作列表组成,所述动作列表包含一个或多个动作及其参数,所述SQL语句用于筛选或转换消息中的数据,SQL描述规则的格式为:SELECT<字段名>FROM<主题>[WHERE<条件>],其中:FROM子句将规则挂载到某个主题上;SELECT子句用于对数据进行变换,并选择出感兴趣的字段;WHERE子句用于对SELECT选择出来的某个字段施加条件过滤;

所述JSON描述规则的格式为:规则:{SQL语句,动作列表:[{动作1,动作参数,绑定资源:{资源配置}},{动作2,动作参数,绑定资源:{资源配置}}]};

②动作:SQL语句匹配通过之后,所执行的任务,动作定义了针对数据的操作;

③资源:通过资源类型为模板实例化出来的对象,保存了与资源相关的配置和系统资源;

④资源类型:资源类型是资源的静态定义,描述了此类型资源需要的配置项。

作为本发明的进一步改进,所述SQL描述规则中,如果对于一个数组数据,针对数组中的每个元素分别执行操作并执行动作,则使用FOREACH-DO-INCASE语法(FOREACH<字段名>[DO<条件>][INCASE<条件>]FROM<主题>[WHERE<条件>]),FOREACH子句用于选择需要做FOREACH操作的字段;DO子句用于对FOREACH选择出来的数组中的每个元素进行变换,并选择出感兴趣的字段;INCASE子句用于对DO选择出来的某个字段施加条件过滤。

作为本发明的进一步改进,在步骤S2中,触发规则的条件以SQL语句表示,该语句以元组{select{from,to}}的方式存储在mnesia数据库中,每次添加规则需要判断规则是否重复,是否有效;规则配置完成后,提交到服务器保存,待下次更新或加载。

作为本发明的进一步改进,在步骤S3中,所述的规则加载方式包括静态加载和动态加载;所述静态加载是启动服务器的时候,根据配置信息加载基本规则,基本规则涉及MQTT消息转发基本功能,包括使用的MQTT协议的版本号,是否使用connected,published,subscribed回调,以及各种功能是否需要启动;动态规则包含客户通过web页面添加的规则,加载动态规则无需重启服务器,动态可根据业务需要动态加载,加载的规则保存在mnesia数据库和ets数据库中,对不同类型和priority优先级的规则,具有不同的加载顺序,避免重复加载。

作为本发明的进一步改进,由于条件的判断和执行会在多规则间存在冲突,故步骤S4还包括冲突解决算法,具体包括:

利用ERLANG语言的模式匹配方式,首先从N条规则中取出一条规则R;然后将数据和events事件进行组合成一个组合C;用组合C测试规则R,如果测试表明条件触发,将{R,{C,ACTION}}加入冲突集中;取出下一个组合C,判断条件;取出下一条规则R;在冲突集中采用树+链表+锁对每个冲突进行分析,判断是否存在循环链表,如果没有循环链表,顺序执行该链表上的动作;否则根据不同的要求解除循环,并执行。

本发明的有益效果是:

本发明的规则引擎通过嵌入在消息中心的消息转发过程中对数据进行过滤、转换和丰富,实现高效的数据处理。新的规则引擎涵盖了消息中心多个插件的功能,将原先插件中独立的外部资源进行集中管理,实现资源复用,降低管理监控复杂度。同时,规则引擎将大部分原先只能在应用端进行的计算内置到消息中心,通过计算、过滤、筛选高价值数据提高消息处理效率的同时,精简了业务架构、减少数据传递路径降低了消息处理时延。

附图说明

图1为本发明实施例中消息中心中规则引擎的触发及执行步骤流程图;

图2为本发明实施例中规则的组成结构示意图。

具体实施方式

下面结合附图对本发明的实施例进行详细说明。

实施例

如图1和图2所示,一种MQTT消息中心引入规则引擎的方法,本实施例提供了在MQTT中加入规则引擎,控制消息业务流程的系统。首先重新设计了数据结构描述规则,该规则结构简单,描述丰富,便于扩展;包括以下步骤:

S1、首先设计了四种数据类型构建数据结构描述规则。这四种数据类型分别是:

①规则(Rule):包括采用SQL描述规则和采用JSON描述规则;

SQL描述规则由SQL语句和动作列表组成。动作列表包含一个或多个动作及其参数。

SQL语句用于筛选或转换消息中的数据。

格式:SELECT<字段名>FROM<主题>[WHERE<条件>]

其中FROM子句将规则挂载到某个主题上;SELECT子句用于对数据进行变换,并选择出感兴趣的字段;WHERE子句用于对SELECT选择出来的某个字段施加条件过滤。如果对于一个数组数据,想针对数组中的每个元素分别执行一些操作并执行Actions,需要使用FOREACH-DO-INCASE语法。其基本格式为(FOREACH<字段名>[DO<条件>][INCASE<条件>]FROM<主题>[WHERE<条件>])。FOREACH子句用于选择需要做foreach操作的字段,注意选择出的字段必须为数组类型;DO子句用于对FOREACH选择出来的数组中的每个元素进行变换,并选择出感兴趣的字段;INCASE子句用于对DO选择出来的某个字段施加条件过滤;其中DO和INCASE子句都是可选的。DO相当于针对当前循环中对象的SELECT子句,而INCASE相当于针对当前循环中对象的WHERE语句。

SQL语句既可以处理消息(消息发布),也可以处理事件(客户端上下线、客户端订阅等)。对于消息,FROM子句后面直接跟主题名;对于事件,FROM子句后面跟事件主题。事件消息的主题以"$events/"开头,比如"$events/client_connected"客户端连接,"$events/session_subscribed"客户端订阅。

JSON描述规则:JSON简单清晰的层级结构,独立于语言的特征,便于书写、阅读的特点,是一种最好的描述规则的方式。格式如下:规则:{SQL语句,动作列表:[{动作1,动作参数,绑定资源:{资源配置}},{动作2,动作参数,绑定资源:{资源配置}}]}。

②动作(Action):是SQL语句匹配通过之后,所执行的任务。动作定义了一个针对数据的操作。动作可以绑定资源,也可以不绑定。例如,“inspect”动作不需要绑定资源,它只是简单打印数据内容和动作参数。而“data_to_webserver”动作需要绑定一个web_hook类型的资源,此资源中配置了URL。

③资源(Resource):资源是通过资源类型为模板实例化出来的对象,保存了与资源相关的配置(比如数据库连接地址和端口、用户名和密码等)和系统资源(如文件句柄,连接套接字等)。

④资源类型(ResourceType):资源类型是资源的静态定义,描述了此类型资源需要的配置项。

S2、规则的数据结构按上面的要求定义好后,可以通过图形化界面添加和修改规则。触发规则的条件以SQL语句表示,该语句以元组{select{from,to}}等方式存储在mnesia数据库中。每次添加规则需要判断规则是否重复,是否有效。例如:选择客户端连接事件,筛选Username为test的设备并获取连接信息的时候,只需要添加如下的sql语句即可:SELECT clientid,connected_at FROM"$events/client_connected"WHERE username='test'存储成{{select,[clientid,connected]},{from,["$events/client_connected"]},{where,{or,[{username,'test'}]}}};触发条件后执行的动作包含五种:空动作;消息重新发布;检查;数据桥接;发送数据到服务。配置完该规则后,提交到服务器保存,待下次更新或加载。

S3、设计两套规则加载方式。一种静态加载;一种动态加载。静态加载是启动服务器的时候,根据配置信息加载基本规则。该规则主要涉及到MQTT消息转发基本功能,包括使用的MQTT协议的版本号,是否使用connected,published,subscribed等回调,以及各种功能是否需要启动等。动态规则包含客户通过web页面添加的规则。加载该类规则无需重启服务器,该类规则可根据业务需要动态加载。加载的规则保存在mnesia数据库和ets数据库中。对不同类型和priority优先级的规则,具有不同的加载顺序,避免重复加载。

S4、所有MQTT消息中心接收且转发的数据和event事件数据都会回调不同的插件hook,判断数据是否满足相应的规则条件。由于条件的判断和执行会在多规则间存在冲突,需要设计一套冲突解决算法。充分利用ERLANG语言的模式匹配方式,首先从N条规则中取出一条R;然后将数据和events事件进行组合成一个组合C;用C测试规则R,如果测试表明条件触发,将{R,{C,ACTION}}加入冲突集中;取出下一个组合C,判断条件;取出下一条规则R。在冲突集中采用树+链表+锁对每个冲突分析,判断是否存在循环链表。如果没有循环链表,顺序执行该聊表上的ACTION动作;否则根据不同的要求解除循环,并执行。

下面对本实施例作进一步说明:

本实施例中规则描述了数据从哪里来、如何筛选并处理数据、处理结果到哪里去三个配置,即一条可用的规则包含三个要素。触发事件:规则通过事件触发,触发时事件给规则注入事件的上下文信息(数据源),通过SQL的FROM子句指定事件类型;处理规则(SQL):使用SELECT子句和WHERE子句以及内置处理函数,从上下文信息中过滤和处理数据;响应动作:如果有处理结果输出,规则将执行相应的动作,如持久化到数据库、重新发布处理后的消息、转发消息到消息队列等。一条规则可以配置多个响应动作。

在消息发布或事件触发时将触发规则引擎,满足触发条件的规则将执行各自的SQL语句筛选并处理消息和事件的上下文信息。

消息发布:处理设备到消息中心的消息,实现条件计算筛选、消息结构调整,消息重新发布、持久化与桥接。可以将设备到消息中心的消息路由或写入到各类数据库、消息队列、HTTP REST网关等对象或资源中,或重新发送到设备以实现服务端计算功能。按照消息的主题进行过滤,指定要处理的消息,处理后重新发布到新主题;制定筛选条件,针对消息正文特定字段进行条件筛选,处理满足条件的数据;将消息正文转换为预置结构再处理,削减内部通信与外部存储、计算开销;使用消息摘要、编码转换、数学运算等多种预处理方式处理消息正文或消息正文中指定字段,在Broker中完成简单计算以降低操作延迟。

事件触发:处理设备通信生命周期中的各个事件信息,可方便实现设备状态记录如上下线通知,认证连接记录、消息状态记录如消息计费统计等功能;资源管理:集中管理外部资源,实现资源复用,降低管理监控复杂度。借助规则引擎中的事件规则,用户可以处理设备通信生命周期中的各个事件信息。设备各个事件动作log,如设备连接/断开连接、消息发布、消息传送/抵达/丢弃、设备订阅/取消订阅等事件,用于设备操作记录与行为分析;设备上下线通知与记录,监听client.connected与client.disconnected两个事件可以实现设备上下线记录;消息状态记录,监听message相关事件可以实现关键消息指令状态监测如下发成功/失败回调等。

随着消息业务逻辑越来越复杂,迫切需要解构业务逻辑和数据。以独立维护的方式,为系统的频繁升级扩展提供了可能。规则引擎取代了业务逻辑的结构复杂,以可配置的方式简化了消息业务逻辑,为第三方服务的接入提供了便利,对MQTT消息中心的业务分成两种类型规则。

一:基本功能规则:

包括使用的MQTT协议的版本号,是否使用connected,published,subscribed等回调,以及各种功能是否需要启动等。

二:扩展业务规则:

包含客户通过web页面添加的规则。加载该类规则无需重启服务器,该类规则可根据业务需要动态加载。加载的规则保存在mnesia数据库和ets数据库中。对不同类型和priority优先级的规则,具有不同的加载顺序,避免重复加载。

本实施例MQTT消息中心引入规则引擎的方案,简化了MQTT消息服务器的功能开发,方便服务升级,避免系统重启。引入的规则引擎能分离消息中心的数据和业务逻辑。把需要升级,变更的约束,完整性,校验,分支流等功能,服务设计成业务规则。消息中心通过后台管理系统,编译,添加新的功能服务,动态的加载规则,使得系统的开发,维护和升级变得更容易。采用ERLANG+SQL+JSON的方式使系统的性能得到了大幅度的提升。

以上所述实施例仅表达了本发明的具体实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。

相关技术
  • MQTT消息中心引入规则引擎的方法
  • MQTT消息中心引入规则引擎的方法
技术分类

06120112242498