Esper简介
1. CEP(Complex Event Processing, 复杂事件处理)
事件(Event)一般情况下指的是一个系统中正在发生的事,事件可能发生在系统的各个层面上,它可以是某个动作,例如客户下单,发送消息,提交报告等,也可以是某种状态的改变,例如温度的变化,超时等等。通过对这些事件进行分析,可以提取出其中有效的信息。 根据维基百科的定义,事件处理(Event processing)指的是跟踪系统中发生的事件,分析事件中的信息并从中得到某种结论。而复杂事件处理,则是结合多个事件源中的事件,从中推断出更加复杂的情况下的事件。
由此可见,CEP的目的包括:(1)识别所需要的事件;(2)快速地对这些事件进行处理。 通常情况下,我们想要利用CEP达到的目的是掌握当前的某种情况或者说状态,因此CEP感兴趣的不是事件本身给出的信息,而是通过这些信息所能推导出的某种结论,通过CEP,我们能够让这些事件变得有意义。
要实现一个CEP引擎,需要考虑的事情包括: (1)吞吐量; (2)低延迟,从事件到达到事件被处理,不能有太大的延迟; (3)复杂的逻辑处理,CEP需要能够对事件进行较为复杂的操作,例如,检测事件之间的相关性,过滤,加窗,连接等。
2. Esper
Esper是一个开源的复杂事件处理引擎,它的目的是让用户能够通过它提供的接口,构建一个用于处理复杂事件的应用程序。
从Esper的架构图中,可以看出,Esper主要包括了三个部分:Input adapter,Esper engine,Output adapter。
2.1 Input adapter & Output adapter
输入适配器和输出适配器的主要目的是接收来自不同事件源的事件,并向不同的目的地输出事件。 目前,Esper提供的适配器包括File Input and Output adpter, Spring JMS Input and Output Adapter, AMQP Input and Output Adapter, Kafka Adapter等等。这些适配器提供了一系列接口,可以让用户从不同的数据源读取数据,并将数据发送给不同的目的数据源,用户可以不用自己单独编写客户端代码来连接这些数据源,感觉相当于对这些数据源提供了一层封装。
2.2 Esper engine
Esper引擎是处理事件的核心,它允许用户定义需要接收的事件以及对这些事件的处理方式。
2.2.1 Esper支持的事件表现形式
Esper支持多种事件表现形式,包括遵循JavaBean方式的含有getter方法的Java POJO(普通Java对象),实现了Map接口的对象,对象数组,XML文档对象,以及Apache Avro(一个支持JSON和Schema的数据序列化系统,可以将数据结构或对象转化成便于存储和传输的格式)。 这些事件表现形式的共同之处在于,它们都提供了事件类型的元数据,也就是说能够表示事件的一系列属性,例如,一个Java对象可以通过其成员变量来表示其事件属性,一个Map对象能够通过键值对来表示属性。由此可见,本质上事件是一系列属性值的集合,对事件的操作即对事件中的部分或全部属性的操作。
2.2.2 Esper事件处理模型
Esper的事件处理模型主要包括两个部分:Statement和Listener。 (1)Statement 利用Esper的事件处理语言EPL声明对事件进行的操作,Esper中提供了多种类型的事件操作,包括过滤、加窗、事件聚合等等。EPL是一种类似于SQL的语言,从这一点上来看,Esper恰好与数据库相反,数据库时保存数据,并在数据上运行查询语句,而Esper是保存查询语句,在这些查询上运行数据,只要事件与查询条件匹配,Esper就会实时进行处理,而不是只有在查询提交的时候才处理。 假设现在要处理的事件是用户注册事件,注册时用户需要提供用户名和年龄,那么事件中将包含用户名和年龄两个属性,而我们要做的事是计算用户的平均年龄,那么,首先应该定义一个事件类PersonEvent,并加上getter方法:
public class PersonEvent extends Event {
private String name;
private int age;
public PersonEvent(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
然后,通过EPL语言声明对事件的操作,此处为取平均值:
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.events.Event;
import com.events.OrderEvent;
import com.events.PersonEvent;
import com.listener.OrderEventListener;
import com.listener.PersonEventListener; public class EsperClient { private EPServiceProvider engine; public EsperClient() {
//obtain an engine instance
this.engine = EPServiceProviderManager.getDefaultProvider();
//System.out.println(engine.getURI());
} public void personEventProcess() { //tell the engine about the event type
engine.getEPAdministrator().getConfiguration().addEventType(PersonEvent.class);
//create an epl statement
String epl = "select name, age from PersonEvent";
EPStatement statement = engine.getEPAdministrator().createEPL(epl); } public void send(Event event) { engine.getEPRuntime().sendEvent(event); } }
其中,send方法用于向Esper引擎发送一个事件,当引擎接收到这个事件后,便可根据事件的类型进行相应的处理。 (2)Listener Listener用于监听事件的处理情况,接收事件处理的结果,通过UpdateListener接口来实现,它相当于一个回调函数,当事件处理完成之后,可以通过该回调函数向结果发送到目的地。此处将处理结果打印到控制台:
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.UpdateListener; public class PersonEventListener implements UpdateListener { @Override
public void update(EventBean[] newEvents, EventBean[] oldEvents) {
// TODO Auto-generated method stub
EventBean event = newEvents[0];
System.out.println(String.format("Name: %s, Age: %d", event.get("name"), event.get("age")));
} }
然后将对事件的操作声明和监听器关联起来:
public void personEventProcess() {
//tell the engine about the event type
engine.getEPAdministrator().getConfiguration().addEventType(PersonEvent.class);
//create an epl statement
String epl = "select avg(age) from PersonEvent";
EPStatement statement = engine.getEPAdministrator().createEPL(epl);
//attach a callback to receive the results
statement.addListener(new PersonEventListener());
}
测试:
import com.esper.client.EsperClient;
import com.events.PersonEvent; public class Test { @SuppressWarnings("static-access")
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub EsperClient ec = new EsperClient();
ec.personEventProcess();
ec.send(new PersonEvent("name", 10));
ec.send(new PersonEvent("name", 20));
}
}
Esper简介的更多相关文章
- 复杂事件处理引擎—Esper入门(第二弹)
说明: 以下内容,可以参考Esper官方网站<Qucik start & Tutorial >(顺序做了部分调整). PS:因为英语水平有限(大学期间刚过CET4的英语小盲童一枚) ...
- Esper——内存计算、事件驱动、SQL支持
教程简介Esper是一个事件流处理(ESP)和事件关联引擎(CEP的,复杂事件处理).Esper的目标是针对实时事件驱动架构(EDA).当Esper监测到事件流中又符合条件的时间发生时,即可触发Pla ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
随机推荐
- LightOJ 1213 Fantasy of a Summation(规律 + 快数幂)
http://lightoj.com/volume_showproblem.php?problem=1213 Fantasy of a Summation Time Limit:2000MS ...
- JS判断时特殊值与boolean类型的转换
扒开JQuery以及其他一些JS框架源码,常常能看到下面这样的判断,写惯了C#高级语言语法的我,一直以来没能系统的理解透这段代码. var test; //do something... if(tes ...
- Message Loop 原理及应用
此文已由作者王荣涛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Message loop,即消息循环,在不同系统或者机制下叫法也不尽相同,有被叫做event loop,也有 ...
- Android优化之内存优化倒计时篇
本文来自网易云社区 作者:聂雷震 本篇文章介绍的内容是如何在安卓手机上实现高效的倒计时效果,这个高效有两个标准:1.刷新频率足够高,让用户觉得这个倒计时的确是倒计时,而不是幻灯片:2.不能占用太多的内 ...
- HBase – 存储文件HFile结构解析
本文由 网易云发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. HFile是HBase存储数据的文件组织形式,参考BigTable的SSTable和Hadoop的TFile ...
- VMware 中时间同步设置
在VMware Workstation 9中安装了一个Ubuntu Server,跑了一段时间之后常发现虚拟机中系统(客户系统)时间要比物理机(宿主系统)中的系统时间慢很多. 几经折腾(部署在VMwa ...
- 如何建立git 远程仓库
第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开Shell ...
- linux - 【LAMP环境配置安装注意安装步骤】 9
(一)安装gcc glibc-devel glibc-headers ==>依赖项 kernel-headers ==>依赖项 libgomp gcc-c++ libstdc++-deve ...
- Mysql Insert Or Update语法实例
有的时候会需要写一段insert的sql,如果主键存在,则update:如果主键不存在,则insert.Mysql中提供了这样的用法:ON DUPLICATE KEY UPDATE.下面就看看它是如何 ...
- BruteXSS(汉化版)
BruteXSS是一个非常强大和快速的跨站点脚本暴力注入.它用于暴力注入一个参数.该BruteXSS从指定的词库加载多种有效载荷进行注入并且使用指定的载荷和扫描检查这些参数很容易受到XSS漏洞.得益于 ...