规则引擎在IoT的重要性?
前言

物联网的强大功能主要来自于它使我们能够实时做出更准确的决策的能力,这些在通知、自动化和预测性维护上都有所体现。因此我们需要能对实时数据进行实时响应的工具,答案就是规则引擎。规则引擎可以通过摄取实时数据,对该数据进行推理并根据该推理过程的结果调用自动操作或者第三方API来履行职责。
IoT案例探讨
这里有一个智能农业的场景:
如果某种植物的生长需要维持恒温恒湿的环境,温度为18~20℃,相对湿度为85~90%。如果温度低于18℃,我们需要升温并对湿度进行补充;当高于20℃,我们需要降温并对湿度进行检查。
您可以在应用程序中轻松实现上述的规则或逻辑。但是,如果您将接到了其他一些需求,例如:
- 如果存在大量逻辑,那么您将如何有效的编写和处理它们? (很好的代码设计模式)
- 如果逻辑经常更改,并且您通常在应用程序中编写逻辑代码,那么您将如何管理或频繁更改代码? (避免频繁部署)
- 设计应用程序以便让业务人员可以轻松维护和理解。(非技术成员使用)
- 如果您必须将所有业务逻辑都放在一个项目中,和其他所有应用程序分开,那么您将在哪里保存它? (微服务架构)
为了在我们的应用程序中满足所有这些要求,但是在启动规则引擎之前,让我们先了解一下规则引擎是什么?
什么是规则引擎?
下面是来自Martin Fowler的一篇文章“我应该使用规则引擎吗?”
规则引擎是一种工具,可以更轻松地使用此计算模型进行编程。它可能是完整的开发环境,也可能是可与传统平台一起使用的框架。近年来,我所见的大多数工具都是设计为适合现有平台的工具。曾经有一种想法是使用这样的工具来构建整个系统,但是现在人们(明智地)倾向于仅将规则引擎用于系统的各个部分。生产规则计算模型最适合仅解决一部分计算问题,因此规则引擎可以更好地嵌入到较大的系统中。
您可以自己构建一个简单的规则引擎。您所需要做的就是创建一堆带有条件和动作的对象,将它们存储在一个集合中,然后遍历它们以评估条件并执行这些动作。但是大多数情况下,当人们提到“规则引擎”时,它们是指专门用来帮助您构建和运行规则引擎的产品。用于指定规则的技术可能有所不同,包括人们将API描述为Java对象的API,表达规则的DSL或允许人们输入规则的GUI。高效的执行引擎有助于使用专门的算法(例如Rete算法)快速评估数百条规则的条件。
规则引擎的一个重要属性是链接 -一条规则的操作部分以改变另一条规则的条件部分的值的方式更改系统状态。链接听起来很吸引人,因为它支持更复杂的行为,但很容易导致很难推理和调试。
这是一个运行在数据上的系统程序, 如果任何条件匹配,那么它就会执行相应的操作。

在上图中,显示了我们以规则(if-then)的形式收集知识并将其存储在任何地方。规则可以存储在文件或数据库之类的任何存储中。现在,规则引擎根据需求选择规则,并在输入数据或查询上运行它们。如果有任何模式/条件匹配,则它将执行相应的操作并返回结果或解决方案。
规则引擎的类型
前向链接(Forward-Chaining)引擎
使用前向链接的推理引擎应用一组规则和事实来推导结论,搜索规则,直到发现IF子句为真为止。根据规则匹配新的或现有事实的过程称为模式匹配,它是由前向链接推理引擎通过各种算法执行的,如Linear、Rete、Treat、Leaps等。
当发现条件为真时,引擎将执行THEN子句,这将导致向其数据集添加新信息。换句话说,引擎从大量事实开始,并应用规则从这些事实中得出所有可能的结论。这就是“前向链接”这一名称的由来——即推理引擎从数据开始,通过推理向前得到答案,这与反向链接相反,后者的工作方式是相反的。
应用案例:目前市场上的大多数物联网平台实际上都有这种类型的规则引擎。下面是几个基于前向链接引擎的自动化工具的例子,这些工具在我们写这篇博客的时候已经在市场上出现了:Redhat Drools, Cumulocity, Eclipse Smart Home, AWS Rules, Thingsboard等等。
条件动作(Condition-Action)引擎
基于条件-动作(CA)规则引擎属于前向链接引擎,但存在一些相关的差异,特别是在物联网领域。与前向链接引擎相比,条件-动作规则引擎不允许多个条件,这使得它们一方面在逻辑表达能力上非常有限,另一方面——可伸缩性更强。条件操作规则引擎(如果-那么)有时使用ELSE语句进行扩展(如果-那么- 或者 - 那么)。
应用案例:物联网领域中这种规则引擎最流行的例子之一是ifttt.com服务。
流处理(flow processing)引擎
基于流的编程是一种将应用程序定义为“黑盒”流程网络的编程范式。这些进程,即函数,被表示为节点,通过消息传递在预定义的连接之间交换数据。节点可以被不断地重新连接,从而形成不同的应用程序,而不必更改它们相关联的功能。
基于流的编程(FBP)自然是“面向组件的”。FBP的好处包括:
- 更改连接接线而不重写组件。
- 本质上是并发的——适合多核CPU世界。
应用案例:
Yahoo! Pipes和Node-RED是使用基于流的编程构建的规则引擎的两个例子。随着“serverless”计算的引入,基于流的编程变得更加流行,在“serverless”计算中,可以通过链接函数构建云应用程序。
IBM的OpenWhisk是一个基于流的编程示例,它通过链接云函数(IBM称之为动作)实现编程。另一种无服务器编排方法(如AWS step functions)基于有限状态机规则引擎。
决策树(decision trees)引擎
捕获条件规则复杂性的一种流行方法是使用决策树,决策树是使用分支方法来说明决策的每一个可能结果的图。
应用案例:
Drools主要以其基于前向链接的规则引擎而闻名,它有一个可与决策表集成的扩展,可以将excel表与嵌入代码片段结合使用,以容纳任何额外的逻辑或所需的阈值。
有限状态机(finite state machines)引擎
状态机可用于根据系统经历的一组状态来描述系统。状态是对等待执行转换的系统状态的描述。过渡是在满足条件或接收到事件时要执行的一组动作。
FSM的概念易于由不同类型的用户掌握。BRE(业务规则引擎)的主要销售论点是BRE软件允许非程序员在业务流程管理(BPM)系统中实现业务逻辑。
FSM经常忽略的一件事是状态暗含着过渡,也就是说,将某种事物建模为状态的唯一目的是导航特定的决策流程。
这样做的直接结果是,FSM缺乏可读性,因为规则变得更加复杂,或者需要将特定的极端情况建模为状态。由于FSM一次只能执行一个转换,因此当用户尝试引入在某些条件下可能发生的事件时,她需要添加一个新状态。当状态数过多时,状态机的可读性会大大下降。
规则引擎的优势
我们可以将给定示例中的所有上述特定要求视为规则引擎的优势。
- 规则很容易被业务分析师,客户团队等任何非技术人员阅读和编码。在这里,您必须专注于“该做什么”,而不是“该怎么做”。
- 您可以将所有规则存储在中心存储中。这意味着您将拥有所有业务规则和逻辑的中心位置。这将是您的真理之源。
- 逻辑与核心应用程序逻辑分开管理,因此可以对其进行管理和重用。
- 在规则引擎中,我们使用不同的模式匹配和冲突解决算法,可提供高性能。
- 对于经常变化的需求,我们可以轻松地更新规则。无需更改代码。
- 如果代码包含许多决策点,则代码的复杂性会更高。规则引擎可以更好地处理它,因为它们使用业务规则的一致表示形式。
- 不同的应用程序可以将相同的规则引擎用于相同的逻辑。它提高了可重用性。

规则引擎在IoT的重要性?的更多相关文章
- Flink/CEP/规则引擎/风控
基于 Apache Flink 和规则引擎的实时风控解决方案 对一个互联网产品来说,典型的风控场景包括:注册风控.登陆风控.交易风控.活动风控等,而风控的最佳效果是防患于未然,所以事前事中和事后三 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Asp.net 面向接口可扩展框架之业务规则引擎扩展组件
随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...
- Atitit.工作流 与 规则引擎
Atitit.工作流 与 规则引擎 1.1. 应用来说,通常分为三部分:界面.业务逻辑和存储1 1.2. 自定义操作系列1 1.3. 自定义按钮系列2 1.1. 应用来说,通常分为三部分:界面.业务逻 ...
- 【java规则引擎】之Drools之Rete算法
一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...
- 规则引擎集成接口(七)规则引擎调用Java类
规则引擎调用Java类 通过myEclipse编写一个简单工程,其中方法是两数相加等到结果,既结果1=输入值1+输入值2.实现规则调用外部接口的方法有三种. 1:接口实例:在myEclipse中制作一 ...
- node(规则引擎)
本文主要记录node的下的一个开源规则引擎nools,给出简单的实例,github地址为: https://github.com/C2FO/nools 定义规则引擎(test.nools) defin ...
- 基于NXBRE规则引擎实现的柔性折扣策略
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规则做出业务决策.应用背景 ...
- BizTalk动手实验(九)业务规则引擎使用
1 课程简介 通过本课程熟悉业务规则引擎(BRE)的使用(本环境为Windows 2008 32位操作系统环境 + Visual Studio 2010 + BizTalk 210) 2 准备工作 1 ...
随机推荐
- java class类和object类
Class类 介绍 Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息 Java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类( ...
- Jmeter 常用函数(3)- 详解 __RandomString
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 根据指定的字符产生一个随机字符串 语法 ...
- Excel提取身份证出生日期②
问题场景 从user表中的身份信息中提取用户的出生日期: 以下方法也可适用于提取其他数据,不仅是身份证信息: 以下图中数据都为测试数据,不具备真实性! 场景一 user表中的18位身份证,提取出生日期 ...
- Ceph Luminous手动解决pg分布不均衡问题
原文链接: https://www.jianshu.com/p/afb6277dbfd6 1.设置集群仅支持 Luminous(或者L之后的)客户端 具体命令: ceph osd set-requir ...
- Java算法——动态规划
基本思想: 动态规划算法通常用于求解具有某种最优性质的问题(作用就是求最优解).在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思 ...
- Sign in with Apple 流程总结
流程图 相关说明 UserId 与用户的 Apple Id 一一对应.在同一个开发帐号下的所有 app 里,获取到的值都一样. IdentityToken identityToken 是一个 Json ...
- Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.需求描述 Qt主进程启动 ...
- make编译出错 usr/bin/ld: /data/app/openssl/lib/libcrypto.a(ecs_asn1.o): relocation R_X86_64_PC32 against symbol `ECDSA_SIG_it' can not be used when making a shared object; recompile with -fPIC
当make编译出现错误 usr/bin/ld: /data/app/openssl/lib/libcrypto.a(ecs_asn1.o): relocation R_X86_64_PC32 agai ...
- 不同SEO对长尾关键词的不同做法
http://www.wocaoseo.com/thread-122-1-1.html 长尾关键词指的是除目标关键词能带来搜索流量的关键词称之长尾关键词,它为一般由几个词语或短语组成,而且随 ...
- 工作不到一年,做出了100k系统,老板给我升职加薪
看了下自己上一次发技术文还是在6月15日,算了算也是两个来月了.别怕,短暂的离开,是为了更好的相遇. 来到新公司以后啊,发现公司的搜索业务是真的太多了,大大小小有几百个搜索业务.来了之后得先梳理.熟悉 ...