教程简介Esper是一个事件流处理(ESP)和事件关联引擎(CEP的,复杂事件处理)。Esper的目标是针对实时事件驱动架构(EDA)。当Esper监测到事件流中又符合条件的时间发生时,即可触发PlainOldJavaObjects(POJO)编写的自定义操作。当数百万数量级的事件同时发生时,我们不可能使用普通的关系型数据库来存储和查询,Esper正是专为这样的大批量关联事件而设计的。Esper提供一个定制的事件处理语言(EPL),允许的条件表达丰富的事件,相关性,可能跨越时间窗,从而减少开发工作需要设置一个系统,可以对复杂的情况作出反应。Esper是一个轻量级的Java编写的内核是完全纳入任何Java进程,JEE应用服务器或基于Java的企业服务总线嵌入的。它使应用程序的过程中收到的消息或事件的大量快速发展。介绍事件流和复杂事件信息是至关重要的作出明智的决定。

from:https://blog.csdn.net/luonanqin/article/details/9900295

说到Esper,不得不说一下CEP。CEP即Complex Event Process,中文意思就是“复杂事件处理”。听起来好像很复杂,实际上就是基于事件流进行数据处理,把要分析的数据抽象成事件,然后将数据发送到CEP引擎,引擎就会根据事件的输入和最初注册的处理模型,得到事件处理结果。

CEP是一种标准,Esper只是对这个标准的一种开源实现。除了Esper,很多大公司也有类似的商业软件,比如IBM,Sybase等等,听说巨贵无比。CEP的一个重要特点就是他是一个内存计算工具和类SQL语句。内存计算可以说是一把双刃剑。好处自不必说,一个字:快!坏处也显而易见,数据有丢失的风险,而且还有容量的限制(实时计算其实并不受制于内存大小,而是得看如何对实时进行定义,也就是具体的业务来决定了)。所以如果业务不能容忍数据丢失,那么高可用方案就必须做好,不过Esper的高可用很不好做,后面我将会说到。

CEP的类SQL语句,可以理解为处理模型的定义与描述。这是运行在CEP引擎中的特殊语句,之所以叫他类SQL,是因为它和SQL确实很像,除了select,insert,delete,update,而且也有avg,count等函数。所以对于会SQL的人来说,他的语法结构大致还是能猜出一二的。在Esper中,这个句子叫做EPL,即Event Process Language。作为Esper的核心内容,对于它的讲解有三四百页的英文文档,所以之后我会慢慢向大家细细说明的。

复杂事件处理引擎—Esper入门(第二弹)

 from:https://www.cnblogs.com/aking1988/p/3281649.html

说明:

  以下内容,可以参考Esper官方网站《Qucik start & Tutorial 》(顺序做了部分调整)。 PS:因为英语水平有限(大学期间刚过CET4的英语小盲童一枚),翻译很烂(自己都感觉不能直视),描述不清的,可以随时问。一有时间,将给予解释。

Tutorial (教程)部分

1、简介 (该部分在入门第一弹中有提起)

Esper 是一个事件流处理和事件关联的引擎(CEP,complex event processing 复合事件处理)。作为实时事件驱动框架,当事件流中有事件条件发生时,Esper能够触发自定义动作(POJO)。Esper也是为了大量事件关联而设计,当有数百万的事件进来时,不能用经典的数据库架构来存储所有事件。

定制的事件处理语言EPL,允许表达丰富的事件条件、关联性,也可跨越事件窗口,从而最大限度的减少为应对复杂情况而必须建立系统的开发难度。

Esper是轻量级的java内核实现,其可以完全嵌入到任何的java进程、javaEE应用服务器或者给予java的ESB(企业服务总线)。Esper可以很快完成传入的大量消息或者事件处理的应用程序。

【总结】Esper是一个事件处理和复杂事件关联处理的java内核的轻量级引擎。对于大量事件的处理,能够用最短的时间做出反应,触发相应的操作。另外,为Esper量身定制的事件处理语言——类SQL语言,对于表达事件的条件以及关联关系的处理等非常方便。

2、事件流和复杂事件

信息对于作出明智的选择是至关重要的。不仅现实生活中这是事实,而且在计算机处理中尤其是一些领域,比如金融、欺诈检测、商业智能或是战场操作等,也是很重要的。信息从不同的来源,以消息或者事件的形式流动,如股票价格在某一特定时间的状态需要给出一个提示。也就是说,看离散的数据大部分时间是没有意义的。交易者需要看到一段时间的股票走势,以便结合其他信息在合适的时间做出最好的交易。

一条一条的离散事件是没有意义的,事件流——一个无限的事件集合——可认为是一个滑动的窗口,进一步关联是非常有意义的,并用最小的延迟对事件做出反应,对有效行动和竞争优势是至关重要的。

【总结】事件流其实一个个离散的事件串接而成。现实中对于事件流的监控或者处理,比如股票信息等,需要实时性的计算其走势,以便能够及时的获取有价值数据。事件流在Esper中是一个滑动的窗口,对事件关联处理等至关重要。

3、Esper

关系型数据库或者基于消息的系统比如JMS,真的很难处理时间数据和实时查询。事实上,数据库需要一个明确的查询来返回有意义的数据,并且在数据放生变化时不适合推送数据。JMS系统是无状态的,需要开发人员自己实现这个时间和聚合的逻辑。相比之下,Esper提供了更高的抽象和智能,可以认为是数据库的倒置:不是存储数据,而是对存储的数据运行查询,Esper允许应用程序存储查询,并让数据运行通过。当满足查询的条件发生时,Esper会做出实时的响应。执行模块是持续的,而不是只有在查询提交的时候。这个概念是EDA(事件驱动架构)的关键基础,在过去的10年,甚至更久都一直在积极的研究。然而,现实中对该系统重要性的认知最近才开始出现。

在Esper中,定制的EPL允许在引擎中注册查询。监听类(POJO类)会在事件满足EPL条件的时候由引擎进行调用。EPL能够表达复杂的匹配条件,包括事件窗口、事件流关联、过滤、聚合以及排序等。Esper statement也可以通过“followed by ” 即“->”条件从多个简单的事件中获取复杂事件。事件可以被描述成JavaBean类、传统的java类、XML或者是Map,作为消息发布者,促进重用现有的系统。

【总结】在处理实时性的数据时,比如心跳监控、股票价格走势等,Esper相对于关系型数据库有天然的优势,Esper不需要对完成的数据的存储,便可以完成数据的实时查询处理,从这点看,更像是数据库的倒置——试想一下,数据库是先存储数据,通过编译解析SQL,完成已存储数据的查询,Esper则是先编译EPL语句,形成一个过滤(或处理)层(或者网),实时过来的数据,通过这个过滤层完成有效事件的筛选或形成有效事件。Esper的事件处理语言——EPL,是类SQL语言,其select 语句、from语句、where语句以及group by 、having等,甚至包括大部分的聚合函数等,都和标准的SQL语言一致。在EPL规则的编写上,对于有数据库开发经验的人来说,上手十分容易。

4、开发事件驱动应用

用Esper来开发事件驱动应用并不困难。大概有下面的几步:

1> 通过分析业务域和定义探测的情景或者需要报告的信息,定义应用程序应该完成的功能或任务。

2> 定义性能要求,特别是吞吐量和延迟。

3> 确定从什么地方获取事件。

4> 根据业务确定事件格式和事件内容。

5> 设计导致复杂事件的事件关系。

6> 事件源。

7>  设计事件表示类型:java类、map、或XML等

8> 定义EPL语句,用于匹配模式和流的处理。

9> 比如,用CSV适配器作为事件模拟工具,测试检测场景,或产生加载加载事件。

10> 在最终的环境上,测试吞吐量和延迟。

5、设计事件表示方式

在Esper当中,java类是一种简单、丰富且通用的事件表示方式。通过接口和超类,java类提供了继承性和多态性,通过一个对象graph,就可以表示一个复杂的业务域。Maps或XML也是事件表示的一种方式。

6、事件流分析

EPL语句从一个或者多个事件流中派生和聚合信息,加入或合并事件流,并将一个时间流的结果提供给后续的语句。EPL在select语句和where语句的使用上,和SQL很相似。不过EPL语句用事件流和views替换了数据库的表格。和SQL中表格相似,views定义了可用于查询和过滤的数据。Views可以表示为一个事件流上的一个窗口。Views也可以排序事件、从事件属性获取统计数据、进行事件分组或者处理唯一的事件属性值。

下面的EPL语句用于计算股票事件过去30s的平均价格:

select avg(price) from StockTickEvent.win:time(30 sec)

下面EPL返回的是前100条股票事件的平均值:

select symbol, avg(price) as averagePrice
from StockTickEvent.win:length(100)
group by symbol

下面的例子关联了两个事件流。第一个事件流由欺诈告警事件组成,用于保存过去30分钟的事件信息。第二个流则是withdrawal事件,用来保存过去30秒的事件。这两个流通过account number进行关联:

select fraud.accountNumber as accntNum, fraud.warning as warn, withdraw.amount as amount,
MAX(fraud.timestamp, withdraw.timestamp) as timestamp, 'withdrawlFraud' as desc
from FraudWarningEvent.win:time(30 min) as fraud,
WithdrawalEvent.win:time(30 sec) as withdraw
where fraud.accountNumber = withdraw.accountNumber

7、事件模式匹配

Event patterns match when an event or multiple events occur that match the pattern's definition.

一个或多个事件发生时,事件模式会匹配定义的模式(很别扭啊⊙﹏⊙b)。模式也可以是基于时间的。模式匹配时通过状态机实现的。

模式表达式可以由连接了模式操作符的过滤器表达式组成。通过在圆括号中的嵌入表达式,可以实现更深的模式表达式嵌套。

5类操作符:

·控制模式探测器的创建和终止:every

· 逻辑操作符:and、or、not

· 操作事件顺序的时间操作符:-> (紧跟着发生的,followed by)

· 过滤输出事件的where条件,引起模式探测器的终止:如,timer:within

· 和观察其他事件一样,观察者也观察时间事件,如 timer:interval,  timer:at

下面是一些EPL的例子:

//模式匹配的是在接下来60秒钟IBM股票值大于80的所有事件
every StockTickEvent(symbol="IBM", price>80) where timer:within(60 seconds)
//每小时的第5分钟给出提醒:
every timer:at(5, *, *, *, *)
//当A事件发生时,如果后面跟的是B事件或C事件,则给出提醒(输出A事件)
A -> ( B or C )
//匹配的是每一个EventX,如果后跟EventY事件,并且其objectID和EventX的objectID一样,则给出提醒(输出a事件):
every a=EventX -> every b=EventY(objectID=a.objectID)

8、模式匹配和事件流分析结合使用

当检测到事件序列(或没有事件发生)时,模式就会匹配。模式匹配的结果可以用于进一步的分析和处理。

下面的模式监测的是 Status事件发生后的10s没有相同ID的status事件发生的场景。整个EPL语句进一步计算了所有发生的每个ID的事件总数。

select a.id, count(*) from pattern [
every a=Status -> (timer:interval(10 sec) and not Status(id=a.id)
] group by id

9、命名窗口

命名窗口在引擎中是全局的数据窗口,其可以参与到很多的语句查询,并且可以被多个statement执行select、insert和delete操作。命名窗口和关系型数据库系统的表很相似。

通过下面的几步可以创建命名窗口:

create window AlertNamedWindow as (origin string, priority string, alarmNumber long)

当事件到达时,可以触发一个select、update或delete操作。下面是一个select应用,简单的统计数据窗口中的记录行总数:

on TriggerEvent select count(*) from AlertNamedWindow

10、匹配-识别模式匹配(Match-Recognize Pattern Matching)

匹配-识别模式是一个基于正则表达式的模式匹配语法,是建议列入SQL的标准语法。

下面的匹配-识别模式,探测的是可能出现在事件中的模式,这些事件通过命名窗口(如上声明)保存。这个模式查找的是两个紧跟的事件,即事件之间没有相同的origin。第一个事件必须有一个“high”优先级,第二个事件必须是“medium”优先级。

select * from AlertNamedWindow
match_recognize (
partition by origin
measures a1.origin as origin, a1.alarmNumber as alarmNumber1, a2.alarmNumber as alarmNumber2
pattern (a1 a2)
define
a1 as a1.priority = 'high',
a2 as a2.priority = 'medium'
)

11、变量(Variables)

变量是一个标量、对象或者事件值,可用于所有的statement,包括模式。变量可以用在EPL中任意位置的表达式中。

【总结】开发Esper应用时,事件类型建议采用Java类,对于事件信息的描述更为直观(参考<a href="http://esper.codehaus.org/tutorials/tutorial/quickstart.html">Quick Start</a>)。在具有复杂关系的事件设计中,不建议使用Map的方式(可参考<a href="http://esper.codehaus.org/esper-4.9.0/doc/reference/en-US/html/performance.html#perf-tips-22">Esper参考文档性能部分</a>)。在EPL设计时,根据业务需求,如果能通过标准的SQL语法完成的,尽量不要使用匹配模式,因为在运行时,需要对Pattern进行额外的解析,其规则较SQL复杂,性能上有少许损耗。

数据窗口的使用,能够使得Esper处理更为复杂的应用场景,比如与分布式缓存、静态数据的使用等。变量不难理解,不管是高级的开发语言如java、C/C++,还是脚本语言如ruby、JS等,都有变量的概念,其使用范围,仅限于当前的Esper引擎实例。

另外,本节所描述的信息,如EPL、数据窗口等概念会在后续的更新中详细描述。敬请期待!!

注:转载请注明出处! 谢谢!

Esper——内存计算、事件驱动、SQL支持的更多相关文章

  1. Spark 介绍(基于内存计算的大数据并行计算框架)

    Spark 介绍(基于内存计算的大数据并行计算框架)  Hadoop与Spark 行业广泛使用Hadoop来分析他们的数据集.原因是Hadoop框架基于一个简单的编程模型(MapReduce),它支持 ...

  2. zw版_Halcon图像交换、数据格式、以及超级简单实用的DIY全内存计算.TXT

    zw版_Halcon图像交换.数据格式.以及超级简单实用的DIY全内存计算.TXT Halcon由于效率和其他原因,内部图像采用了很多自有格式,提高运行速度,但在数据交换方面非常麻烦. 特别是基于co ...

  3. <<SAP内存计算——HANA>> 书评

    <SAP内存计算——HANA>又是一本在地铁里读完的书,最近阅读量大增,都是托了地铁的福了. 一年多以前就在ITPUB里发过帖子问“SAP HANA归根揭底到底是什么?”,那时通过一些网络 ...

  4. Spark的误解-不仅spark是内存计算,hadoop也是内存计算

    市面上有一些初学者的误解,他们拿spark和hadoop比较时就会说,Spark是内存计算,内存计算是spark的特性.请问在计算机领域,mysql,redis,ssh框架等等他们不是内存计算吗?依据 ...

  5. zw·10倍速大数据与全内存计算

    zw·10倍速大数据与全内存计算 zw全内存10倍速计算blog,早就在博客园机器视觉栏目发过,大数据版的一直挂着,今天抽空补上. 在<零起点,python大数据与量化交易>目录中 htt ...

  6. 6.计算字段 ---SQL

    提示:客户端与服务器的格式在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成.但一般来说,在数据库服务器上完成这些操作比在客户端中完成要快得多. 一.拼接字段 拼接(conca ...

  7. 「书评」SAP内存计算——HANA

    因为工作关系,长期跟SAP打交道,所以去年就对HANA有了一些了解,只是公司目前的应用规模还较小,暂时没有上马HANA的打算,但是提前作一些学习还是很有必要的.正好清华大学出版社最近出版了这本< ...

  8. 计算完成率 SQL

    计算完成率 SQL ,), ,) ) AS XX_完成率

  9. java中简单内存计算

    今天面试遇到一个问题,假设一个类中只声明一个int类型,那么这个对象多大,这里先写出解决方案,首先引入内存计算工具lucene-core, <dependency> <groupId ...

随机推荐

  1. 处理函数和数组声明[条款17]---《C++必知必会》

    指向函数的指针声明和指向数组的指针声明容易混淆,原因在于函数和数组修饰符的优先级比指针修饰符的优先级高,因此通常需要使用圆括号. int *f1( );//一个返回值为 int* 的函数 int ( ...

  2. git---小乌龟提交

    下载地址:https://tortoisegit.org/ 比如我修改了文件: 1.本地提交在项目目录内右键,点击git commit按钮 2.拉去线上最新代码,与本地代码合并 3.向线上推送

  3. mvc结合web应用实例分析

    Mvc的web应用实例分析 Login.jsp——视图部分的输入文件success.jsp——视图部分的输出文件failure.jsp——视图部分的输出文件LoginBean.java——模型部分Lo ...

  4. Mysql 数据类型及选择原则

    MySQL中的数据类型大的方面来分,可以分为:日期和时间.数值,以及字符串.下面就分开来进行总结. 数据库类型的选择对数据库的性能影响很大 1 . 数据类型会影响存储空间的开销 2 . 数据类型会影响 ...

  5. JS与JAVA数据类型的区别

    JavaScript与Java数据类型的区别   阅读目录 Number String Boolean Null Undefined Object 今天开始正式认真学习js,虽然在平常j2ee开发中也 ...

  6. 20145216史婧瑶《Java程序设计》第四次实验报告

    实验四 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输出学号 实验步骤 1.搭建Android环境 2.安装Android,核心是配置JDK.SDK 3. ...

  7. 前端小炒的win7使用笔记(收藏篇)

    收藏篇 此中技巧及使用笔记,大多为冲浪时无意间发现,进而总结,其中种种小超都已一一验证过. 传说中WIN7上帝模式可查看200多项系统设置项目 在桌面创建文件夹,命名为 GodModel.{ED7BA ...

  8. 当新手使用JS库遇到问题怎么办

    见标题,知其意.在做网站时候,其实我们会用很多JS库,网络上流行的和公司自己封装的,这些东西都很好用,但是或多或少的有些bug或者有一些缺陷,即使真的很完善,但也可能达不到自己特定的一些需求.所以遇到 ...

  9. POJ-2479 Maximum sum(动态规划)

    最大子序列和的加强版. 借助最大子序列和,分别正向和反向遍历一遍得到left和right数组(具体含义见代码注释) 然后再对left和right数组进行修正,保存从对应元素起向左或向右的最大连续和. ...

  10. HTML请求与相应

    HTTP的请求与响应 HTTP通信由两部分组成: 客户端请求消息 与 服务器响应消息 浏览器发送HTTP请求的过程: 当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送 ...