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

基于docker微服务架构

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

这篇文章旨在详细介绍我将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的Streaming Architecture一书中详细探讨了流架构的好处,该书可免费在线获得 。 我还在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

基于docker微服务架构

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

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

相关文章

php怎样下载网上的文件,php怎样实现文件下载

用head() 和 fread()函数把文件直接输出到浏览器。具体代码&#xff1a;<?php $file_name "down";$file_name "down.zip"; //下载文件名$file_dir "./down/"; //下载文件存放目录//检查文件是否存在if (! file_exists ( $file_dir . $fil…

Windows 系统下,移动硬盘无法识别怎么修复?

方案1&#xff1a;移动硬盘没有驱动器号 有时移动硬盘插入计算机&#xff0c;但无法在我的计算机上显示。此时&#xff0c;可能只是因为移动硬盘没有驱动器号。 右键单击此计算机&#xff08;计算机&#xff09;&#xff0c;然后单击[管理]将其打开。 点击左边的[磁盘管理]&a…

欢乐鼠标自动点击器_使用ESP32 DIY蓝牙自动点击器,滑屏器

前言因为爱薅羊毛&#xff0c;然后正好最近免费车一趟接一趟&#xff0c;咪咕开完&#xff0c;京东开&#xff0c;京东开完掌阅开&#xff0c;下一个不知道是谁&#xff0c;&#xff0c;&#xff0c;&#xff0c;可我又不是什么很有耐心的人&#xff0c;虽然我喜欢看书&#xf…

java单词按字典排序_最终Java日志字典:开发人员最常记录的单词是什么?

java单词按字典排序最终的记录字典&#xff0c;或者&#xff1a;我们记录的最常见单词是什么&#xff1f; 日志文件是调试应用程序的最常用方法&#xff0c;当解决错误时&#xff0c;它们肯定可以引导我们朝正确的方向发展。 但是&#xff0c;大多数日志文件每天都会增加一百万…

winscp使用密钥登录远程linux系统

说明&#xff1a; WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时putty也是一个开源连接ssh的windows客户端&#xff0c;本文介绍puttyWinSCP密钥对登录linux服务器。 1. 创建密钥对 安装openssl yum –y install openssl #openssl一般服务器都会预装 创建密…

php api 实例maccms,苹果cmsV10API接口说明

api接口仅供提供数据&#xff0c;可以直接在苹果CMS后台联盟采集中加入-并提供给他人采集。联盟资源分配唯一标识ID&#xff0c;用来区别绑定分类&#xff0c;这个ID一般由苹果CMS官方提供&#xff0c;不可随意修改设置&#xff0c;否则造成入库分类错乱。视频接口同时支持老板…

dml语句包括哪些_聊聊MySQL基本操作DDL,DML,DQL,DCL

本篇文章来回顾一下MySQL的基本操作之DDL&#xff0c;DML&#xff0c;DQL&#xff0c;DCL&#xff0c;每种操作都有各自不同的语法&#xff0c;常用的操作汇总如下。一、DDL-数据定义语言作用&#xff1a;数据定义语言主要用来定义数据库中的各类对象&#xff0c;包括用户、库、…

Windows 系统下使用 putty 客户端通过 SSH 远程连接 AWS 服务器

找到在购买亚马逊的AWS服务器时保存的密钥文件&#xff08;假设为abc.pem&#xff09;。 打开PuTTYgen&#xff0c;如下图&#xff0c;点击图中1处的“load”,找到abc.pem文件所在的位置&#xff0c;并选择abc.pem&#xff0c;确定&#xff1b; 然后&#xff0c;选择图中2处…

ip integrator_使用Oracle Data Integrator(和Kafka / MapR流)完善Lambda体系结构

ip integrator“ Lambda体系结构是一种数据处理体系结构&#xff0c;旨在通过利用批处理和流处理方法来处理大量数据。 这种体系结构方法尝试通过使用批处理提供批处理数据的全面而准确的视图&#xff0c;同时使用实时流处理提供在线数据的视图来平衡延迟 &#xff0c; 吞吐量和…

php 如何获取函数类型,PHP如何使用gettype()函数判断变量的类型?

gettype()函数是PHP中的一个内置函数&#xff0c;用于获取变量的类型&#xff1b;它可用于检查现有变量的类型。下面本篇文章就来给大家介绍一下gettype()函数&#xff0c;希望对大家有所帮助。【视频教程推荐&#xff1a;PHP教程】基本语法string gettype ( $var )参数&#x…

qfile 创建文件_Qt之二进制文件读写

点击上方“Qt学视觉”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达想要学习的同学们还请认真阅读每篇文章&#xff0c;相信你一定会有所收获除了文本文件之外&#xff0c;其他需要按照一定的格式定义读写的文件都称为二进制文件&#xff0c;每种格式的二进…

cloud foundry_实际的Reactor操作–检索Cloud Foundry应用程序的详细信息

cloud foundryCF-Java-Client是一个库&#xff0c;可通过程序访问Cloud Foundry Cloud Controller API 。 它建立在Project Reactor之上&#xff0c;它是Reactive Streams规范的实现&#xff0c;并且使用此库在Cloud Foundry环境中做一些实际的事情是一个有趣的练习。 考虑一个…

iis开启php验证码,php结合GD库实现中文验证码的简单方法

前言上一次写了一个常见的验证码&#xff0c;现在玩一下中文的验证码&#xff0c;顺便升级一下写的代码流程基本差不多先看GD库开启了没生成中文5位验证码开始画图画干扰素生成图形完事生成中文验证码//小小心机$hanzi "如果觉得写得还可以的话互相关注报团取暖交流经验来…

Linux 系统关于应该把程序安装在目录 /usr 还是目录 /usr/local 下的思考

对于一个以 LFS(Linux From Scratch 大意&#xff1a;自己做出来的 Linux) 为基础的系统来说&#xff0c;这是一个没有明确答案的问题。什么是 LFS&#xff1f; 在传统的 Unix 系统中&#xff0c;/usr 通常只包含系统发行时自带的程序&#xff0c;而 /usr/local 则是本地系统管…

数据结构设计_合并多种疾病,如何设计数据结构?

如果一个患者合并多种疾病或应用多种药物&#xff0c;如何设计数据结构&#xff1f;例如病史&#xff0c;建议设计成多选题。如果未患病&#xff0c;只需点一次“全无”&#xff0c;操作简单。如果选了全无&#xff0c;其他选框系统自动关闭&#xff0c;就不能再后面的选项了&a…

java ee的小程序_用微服务和容器替换旧版Java EE应用程序服务器

java ee的小程序Lightbend最近对2000多个JVM开发人员进行了一项调查&#xff0c;结果刚刚发布。 开展该调查的目的是发现&#xff1a;发展趋势与IT基础架构趋势之间的相关性&#xff0c;处于数字化转型前沿的组织如何使他们的应用程序现代化以及当今对新兴开发人员技术最为关注…

Linux系统下如何安装JDK?

一、首先下载linux版本jdk 点击进入jdk官网 根据自己的需求&#xff0c;下载不同版本的jdk 2.将下载好的jdk压缩包&#xff0c;通过ftp上传到linux系统的当前用户下&#xff0c;我当前登录的用户为root用户 3.将上传后的jdk&#xff0c;解压到/usr/local/目录下&#xff0c…

php网站模板怎么修改,网站后台模板修改

方法1、首先制作网站背景图片&#xff0c;这个建议找一些大尺寸的图片。(本图仅限测试使用)2、通过FTp工具链接到网站的空间&#xff0c;找到dedecms网站的模版文件templets。找到模版目录下的模版样式文件。如果使用的是默认模版&#xff0c;文件在templets/default/style/ded…

python练手经典100例微盘_Python练手项目实例汇总(附源码下载)

1 #_*_ coding:utf-8 _*_ 2 from tkinter import * 3 importrandom4 importtime5 importtkinter.messagebox6 7 8 #俄罗斯方块界面的高度 9 HEIGHT 20 10 11 #俄罗斯方块界面的宽度 12 WIDTH 10 13 14 ACTIVE 1 15 PASSIVE 016 TRUE 1 17 FALSE 018 19 style [20 [[(0,0),(…

Linux 环境变量设置及查看

文章目录一、设置变量的四种方法&#xff08;一&#xff09;在 /etc/profile 文件中添加变量&#xff08;二&#xff09;在用户目录下的 .bash_profile 文件中添加变量&#xff08;三&#xff09;使用命令 export 声明定义变量&#xff08;四&#xff09;使用命令 declare 声明…