使用基于微服务的流架构更好地进行大规模的复杂事件处理(第1部分)

基于微服务的流架构与开源规则引擎相结合,使实时业务规则变得容易

这篇文章旨在详细说明我将OSS业务规则引擎与Kafka风格的现代流消息传递系统集成在一起的项目。 该项目的目标(即众所周知的复杂事件处理(CEP))旨在实现对流数据的实时决策,例如在IoT用例中。

经过大量的写作,我决定将文章分为两部分。 在第一部分中,我将重点介绍什么是CEP,为什么有用,并解释体系结构解决方案以及为什么我们认为对于许多有用的生产用例来说,这是一个好主意。

在第二篇文章中,我将展示一个基于道路交通监控系统的具体示例,并尽可能详细地说明其制作方式。

因此,事不宜迟,继续第1部分!

总览

根据Gartner Inc.的数据,截至2015年,全球企业应用软件市场价值约为1500亿美元。这是一个巨大的市场,其中最常见的应用程序类型之一就是围绕将某种业务逻辑应用于从各个方面生成的数据这生意。

如今,现代企业应用程序需要连接到更多类型的数据源,随数据大小和用户数量扩展,可靠并快速执行。 随着业务需求和条件的变化,长达一年或更长的自定义应用程序开发周期不具有吸引力,因此甚至在应用程序投入生产之前就已过时。

在大型,全国性,区域性或全球性组织中,或在金融,医疗保健或IT等行业中使用大量数据的组织中,需求保持不变,但必须使用大数据技术来满足。 这带来了一系列全新的难题,这些难题使大规模开发企业应用程序的成本变得极为昂贵,并且在IT基础结构和专有技术要求方面也设置了很高的障碍。

因此,需要一种方法来对各种来源收集的数据运行业务逻辑,这可能是非常大规模的,理想情况下是实时的,例如物联网类型的应用程序。

了解复杂事件处理(CEP)

顾名思义,复杂事件处理(简称CEP)并不那么复杂。 从根本上讲,CEP是关于将业务规则应用于流事件数据。 事件数据只是带有时间戳字段的数据。 此类数据的示例可能是Web服务器的日志条目,购买收据或传感器数据,所有这些都可以视为恒定的事件流。 在此流数据上应用规则使响应时可以采取有用的操作。

这是一个智能家居的示例,该智能家居的门口有传感器,智能WiFi路由器和房间移动探测器。 通过CEP将所有数据流式传输到家庭服务器中,用户可以制定如下规则:

  1. 如果是白天,并且门关着并且没有电话连接到WiFi,请将房屋设置为“没人回家”
  2. 如果没有人在家并且门已解锁,则锁上门并打开警报器
  3. 如果没有人在家并且是冬天,请将房屋温度降低到18C
  4. 如果没有人在家并且是夏天,请关闭空调
  5. 如果没有人在家并且门被家庭成员打开,则关闭警报并将房屋设置为“人们在家”

拥有一堆这样的简单规则,确实会很快使一个聪明的家庭加起来。 实际上,在一些竞争性智能家居“集线器”设备中已经可以购买到这种功能,这些设备使用通用协议从房屋周围的兼容传感器设备中读取信息,然后在满足某些规则时将操作推回去。

这种示例可以轻松地移植到许多其他域。 例如,在零售中,购买历史记录和信标可用于生成个性化,位置敏感的消息或优惠券。 在工业应用中,可以使用相对简单的逻辑规则(例如,“如果该机器的红色按钮点亮,则必须停止它”)组合起来,更容易操作和维护许多机床。

CEP规则引擎与手动编码

到目前为止,阅读这些信息的工程师可能不会留下深刻的印象,因为流事件适用简单的规则。 诸如上述的智能家居用例可以很容易地(很好地说)完全通过使用Python进行手工编码并在旧用途的PC或Raspberry Pi上运行来处理。

这类项目有哪些部分?

  1. 数据提取
  2. 定义数据规则
  3. 执行规则
  4. 满足条件时从规则中采取措施。

好的软件体系结构要求尝试使最容易更改的部分易于更改,但要付出使其他部分更加困难的代价。 最需要改变的部分是什么? 数据摄取仅在添加新传感器时才会更改,但是给定传感器的数据不会突然更改。 摘要中的执行规则始终相同; 变化的是规则本身。 编码并可以执行的动作并没有真正改变,但是随着时间的推移添加新动作应该很容易。

当用例开始扩展并且规则数量增加时,规则处理引擎的效率开始变得重要。 此外,当规则数量增加时,使规则易于编辑不仅是“必备”功能,而且是核心要求。

另一个经常使用的论点是业务逻辑与SDLC的分离。 业务需要比软件开发更快。 通过使用规则引擎,两个流在很大程度上可以独立移动。

CEP被“植入”物联网应用

CEP几乎是任何种类的物联网应用程序的要求,例如智能家居,智能农业,工业4.0或电信数据。 从某种意义上说,这是一项要求,即抛开功能的实现方式,物联网需要将规则应用于流事件数据。 无论是在单个私人住宅中进行小规模生产,还是在遍布全球的数家工厂中进行大规模生产,都是如此。

根据我们刚刚描述的内容,理想的设计会反对手动编码的解决方案,并使用所谓的“业务规则处理引擎”。 开源世界中存在着几种,最著名的是Drools。

Drools:开源业务规则引擎

Drools是在开源项目的JBoss框架下开发的一个开源项目。 这是一个具有长期活跃开发历史的项目,当前版本为6.5.0。最终版本为Beta 7。 它相当现代,因为它支持Java 8大大改进的API。

Drools具有我们正在寻找的所有特征,其中包括规则引擎,定义良好的DSL定义规则以及基于RETE算法的规则引擎,该引擎经过了优化和非常快速。 此外,文档非常详尽,并且有大量书籍可以学习有关如何使用此强大框架的所有知识。

最后,Drools带有一个称为Workbench的GUI,它使我们可以可视地创建和编辑规则,而无需编写代码。 这是一项致命功能,它将规则的功能置于业务分析的范围之内。

流传输架构为大数据启用CEP

流架构是CEP的关键组件。 CEP的全部重点是通过流数据(近)实时做出决策,而不是像批处理那样对历史数据进行分析来采取行动。

CEP涉及敏捷性,并且由于大量简单规则的相互作用而导致潜在的复杂行为,这些规则都实时应用于内存中的数据。 基于微服务的流式传输体系结构正成为现代大规模体系结构的标准。

奥德利(O'Reilly)出版的Ted Dunning和埃伦·弗里德曼(Ellen Friedman)的《流传输体系结构》一书详细探讨了流体系结构的优点,该书可免费在线获得 。 我还在2016年新加坡Strata大会上就这一主题发表了演讲。 请去Slideshare看一看 。

一般而言,解决方案将类似于上图。 收集数据源(例如传感器,收银机或日志),并使用轻型ETL将其添加到流中。 然后,数据将被程序使用,该程序将事实数据直接传递到Drools KieSession中。 这是内存中的工作空间,规则引擎使用模式匹配来根据内存中存在的事实查看可以触发哪些规则。

在我们提出的体系结构中,规则驻留在Drools Workbench中,它是一个GUI规则编辑器,还可以用作版本控制和要部署到生产中的规则的存储库。

这种方法的主要好处是将维护应用程序本身的过程与编辑为业务创造价值的规则的过程完全独立。 工程师的任务很明确,即确保系统性能良好且稳定,而业务方面则可以专注于规则。

在上图中,我们可以看到使用MapR集群的实现可能看起来更具体。 对于该特定应用程序,在其位置使用Kafka集群同样有效,尽管这样做会导致出现新用例的可能性降低,并增加系统管理的负担。 这样做的原因是,Kafka集群严格限于支持流传输,而使用聚合集群则允许在同一集群上存在其他用例,无论是操作还是分析用例。

这里的一个关键点是从CEP引擎的第二个箭头回去流。 它说明了将流用于输入和输出的重要概念,这是流体系结构的核心。 这也是为什么显示企业IT系统也从流中获取其数据的原因。

数据流如下所示:

数据从数据源流到事件生产者,后者只是一个流生产者,或者使用新的Kafka REST Proxy调用REST端点。 新发行的MapR Ecosystem Pack 2.0中的 MapR Streams也支持REST代理。

CEP引擎可以从流中读取数据,并从Drools Workbench获取其规则。 从流架构的角度来看,Drools Workbench和CEP Engine是一个单元,可以说是一个微服务,因为它们是完全独立的,并且没有任何外部依赖性。

当规则在规则处理算法中触发时,将需要采取一些外部动作。 这些操作可能是在公司数据库中插入或更新表,索引到Elasticsearch以将数据提供给Kibana仪表板,发送通知。 但是,我们不是通过直接从CEP Engine到外部系统进行调用来将系统紧密耦合在一起,而是将CEP Engine的数据输出回流中的另一个主题。 另一个微服务或应用程序(例如Cask.co或Streamsets )将处理该流。

结论

复杂事件处理已经存在了很长一段时间,但是现在终于有了它。 在硬件方面,具有大量内存的服务更为普遍。 在软件方面,有可能完全在OSS之外创建有用的生产级CEP系统,而无需诉诸昂贵的,自定义编码的流应用程序。

将Kafka风格的流消息传递系统与Drools结合在一起,为组织提供了非常需要的敏捷性,以区分非常不同的任务,以创建和维护企业流应用程序,以及定义和编辑业务逻辑以进行实时决策。

在下一篇博客文章中,我们将介绍一个具体的用例,将所有这些都付诸实践,并说明如何仅使用Java,MapR集群和在Wildfly应用程序服务器上运行的Drools Workbench即可实现这种系统。

翻译自: https://www.javacodegeeks.com/2017/01/better-complex-event-processing-scale-using-microservices-based-streaming-architecture-part-1.html

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

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

相关文章

chown r mysql ._chown -R 用户名:组名 ./ 及 chown用法介绍

当我们在不通过yum(CentOS)、apt-get(Ubuntu)来安装MySQL的时候,通常执行以下命令来改变目录的拥有者:[rootlocalhost ~]# chown -R mysql:mysql ./这两个mysql谁是用户名谁是用户组呢?见chown详解。chown将指定文件的拥有者改为指定的用户或…

c语言abs和fabs的区别是什么?

abs是整数取绝对值,定义在stdlib.h头文件中。而fabs是指浮点数取绝对值,定义在math.h头文件中。 函数原型 int abs(int x) double fabs(double x)

Linux下编译GDAL

一、准备工作 从官网下载GDAL、PROJ.4和GEOS,将其存放在/home/liml/Work/3rdPart目录并解压,如下图所示。下载地址请自行Google。注:使用的系统是CentOS6.4 X64版本,其他的Linux系统都是一样的。 接下来检查系统中是否安装了开发…

PS提示错误1解决办法

重装电脑系统后,PS打不开了,提示错误1.在网上搜索,很多网友说要卸载重装。控制面板看不到ps,于是下载了Adobe卸载工具(点击链接下载),但是这个程序识别不了安装的ps.最后通过以下办法解决。 1.…

如何为你的博客园添加到百度统计

1.打开百度统计的地址 https://tongji.baidu.com/web/welcome/login?castkLTE%3D 2.注册,打开网址后,右面有注册按钮,点击注册 选择站长版,点击去 填写自己的注册信息 3.填完之后,登录进去,在管理标签下有…

mysql 左连接 重复_mysql左连接重复行

我正在设计一个类似于4个表格的字典数据库wordswordid | lemmasenseswordid | synsetidsynsetssynsetid | definitionsamplessynsetid | sample所以我使用下面的查询来获取所有意义定义和样本if(isset($searchterm)){echo "".$searchterm."";// QUERY TO F…

osgi java_使普通的旧Java OSGi兼容

osgi java尽管OSGi在Java世界中越来越流行,但仍有许多Java应用程序和库尚未设计成可在OSGi中使用。 有时您可能需要在OSGi环境中运行这样的代码,或者是因为您想利用OSGi本身提供的好处,或者因为您只需要此特定环境提供的某些功能。 通常&…

Matlab如何求离散点的导数

1.通过差分估算 已知同维度的x和y序列&#xff0c;则可使用diff(y)./diff(x)来估算。设x为n维向量&#xff0c;Dxdiff(x) 计算向量x的向前差分&#xff0c;DX(i)X(i1)-X(i)&#xff0c;0<i<n。 例一 y[7.86 7.84 7.82 7.77 7.72 7.68 7.61 7.51 7.42 7.33 7.21 7.07 6…

ERROR 6: GEOS support not enabled.

要学习GEOS库&#xff0c;肯定绕不开地理方面的东西。如果需要判断的两个多边形或几何图形&#xff0c;不是自己创建的&#xff0c;而是来自shapefile文件&#xff0c;那就得将GEOS库和GDAL/OGR库结合使用了。实际上只需要OGR就行了&#xff0c;但OGR和GDAL是放在一起的。OGR库…

java面向对象(this关键字)

一.this的作用 1.this 相当于是指向当前对象本身 2.成员变量和局部变量同名问题 class Person {private int age;private String name;// 给姓名和年龄初始化的构造方法Person(String name, int age) {// 当需要访问成员变量是&#xff0c;只需要在成员变量前面加上this.即可th…

c语言float二进制输出代码_下面C语言中这十四大谜题,不看答案你能做出来吗?...

C语言领取福利资料前往文末领取本篇文章《C语言的谜题》展示了14个C语言的迷题以及答案&#xff0c;代码应该是足够清楚的&#xff0c;而且我也相信有相当的一些例子可能是我们日常工作可能会见得到的。通过这些迷题&#xff0c;希望你能更了解C语言。如果你不看答案&#xff0…

平台策略:从Portlet到OpenSocial小工具再到渐进式Web应用程序:最新技术

介绍 由于世界仍在Java的掌控之中&#xff0c;因此我们经常定义所谓的基于组件的平台 。 我在2000年的OpenUSS&#xff08;开放大学支持系统&#xff09;方面拥有这一经验。 当时我有一个想法&#xff0c;就是开发一个可以使用组件体系结构和J2EE技术​​&#xff08; OpenUSS …

webm文件怎么在手机上正常播放以及在电脑上转换为mp4格式!

webm是一个开放、免费的媒体文件格式。WebM影片格式是以Matroska&#xff08;即MKV&#xff09;容器格式为基础开发的新容器格式&#xff0c;里面包括了VP8影片轨和Ogg Vorbis音轨&#xff1b;其中Google将其拥有的VP8视频编码技术以类似BSD授权开源&#xff0c;而Ogg Vorbis本…

WKT介绍

WKT&#xff0c;是一种文本标记语言&#xff0c;用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式&#xff0c;亦即WKB(well-known binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。 目录 1概念2几何对象…

DS树+图综合练习--构建邻接表

题目描述 已知一有向图&#xff0c;构建该图对应的邻接表。邻接表包含数组和单链表两种数据结构&#xff0c;其中每个数组元素也是单链表的头结点&#xff0c;数组元素包含两个属性&#xff0c;属性一是顶点编号info&#xff0c;属性二是指针域next指向与它相连的顶点信息。单…

mysql datetime 间隔,MySQL datetime默认时间间隔

Is it possible to add to a default time with NOW(), 10 minutes?Ive tried something like that:CREATE TABLE table1 (date DATETIME NOT NULL DEFAULT DATE_ADD(NOW(), INTERVAL 10 MINUTE));However, it doesnt work.解决方案I dont think you can do this.The DEFAULT …

golang mysql 崩溃_mysql连接问题,goruntime里执行总是出错,程序一直崩溃

初学golang&#xff0c;尝试写一个程序&#xff0c;但是在mysql操作时遇到了问题~看网上文章&#xff0c;推荐mysql直接创建一个db全局变量&#xff0c;然后连接一次&#xff0c;以后使用到直接用这个db&#xff0c;我按照这样的方法&#xff0c;然后进行操作&#xff0c;可是程…

牛客网——点菜问题

题目描述 北大网络实验室经常有活动需要叫外卖&#xff0c;但是每次叫外卖的报销经费的总额最大为C元&#xff0c;有N种菜可以点&#xff0c;经过长时间的点菜&#xff0c;网络实验室对于每种菜i都有一个量化的评价分数&#xff08;表示这个菜可口程度&#xff09;&#xff0c;…

OGR示例:写shp,求面与面的交和差操作

编译命令&#xff1a;g main.cpp -lgdal 调用命令&#xff1a;./a.out 输出shp名称 操作选项 注释&#xff1a;操作选项&#xff08;1&#xff1a;多边形A - 多边形B&#xff0c;2&#xff1a;B - A&#xff0c;3&#xff1a;A和B的交集部分&#xff09; #include "ogr…

Spring Boot和Thymeleaf:重新加载模板和静态资源,而无需重新启动应用程序

Thymeleaf是围绕自然模板的概念设计的&#xff0c;该模板允许进行静态原型制作&#xff1a;模板逻辑不会影响用作原型的模板。 尽管这是一项很棒的技术&#xff0c;但您可能还希望在运行的Spring Boot应用程序中查看结果&#xff0c;而不必每次更改Thymeleaf视图时都重新启动服…