首先介绍一下NESPER的大体结构,NEsper从内容上分为两块,NEsper的核心NEsper.dll和NEsper.IO.dll。

(1)NEsper的核心包包含了EPL语法解析引擎,事件监听机制,事件处理等核心模块。

(2)NEsper的io包含从各种数据源读取数据以及将输出结果写入各种数据源,包括excel,database,msmq,http,socket,XML。

贴一张esper官网上的结构图,方便大家了解esper的结构

接下来对上述结构图进行详细的解释让大家加深对ESPER的了解

1. Event对象:NESPER处理的事件的最小单位,一个任意的CLR对象,属性支持简单的CLR类型、数组、map、以及嵌套POCO,很灵活.

2.EPL:EPL是ESPER的核心,它类似于SQL,但是和SQL的执行方式不同。

SQL是数据在那里,你每次执行SQL就会触发一次查询;而EPL是查询在这里,数据输入达到一定条件即可触发查询。

这个条件可以有多种:

a).每个event对象来就触发一次查询,并只处理当前对象

select * from OrderEvent

这个EPL语句会在每个OrderEvent对象到达后,并将该event交给后续的Listener(后面会讲到)来进行处理。但是这种用法不多见,意义不大。

b).窗口处理模式:

EPL最大的特色就是这个窗口处理模式,有两种窗口,时间窗口和长度窗口。

时间窗口 : 大家想一下,如果有一个场景,要获取最近3秒内OrderEvent的price的平均值,那该怎么做呢?一般的做法需要做个后台线程来做3秒的时间统计,时间到了再做后续处理,虽然不复杂,但是也挺繁琐的。

看看EPL是怎么做的

select avg(price) from test.OrderEvent.win:time(3 sec)

win:time(3 sec)就是定义了3秒的时间窗口,avg(price)就是统计了3秒内的OrderEvent对象的price的平均值

长度窗口: 长度窗口和时间窗口比较类似

select avg(price) from test.OrderEvent.win:length(100)

win:length(10)就是定义了10个Event的,avg(price)就是统计了最近10个的OrderEvent对象的price的平均值

以上这些都比较容易理解,虽然知道了处理方法,也比较好用,我还是比较喜欢钻研一下他的内部实现方式。先来看一张时间窗口模式的图

他仅保留最近时间窗口的对象内容,但是每个Event到来都会触发一次UpdateListener的操作

EPL语句会作为一个Statement来监听事件的到来,当New Events有新事件时就会触发UpdateListener的操作,下面是一个updateListener的简单例子,event.get("avg(price))就可以获得EPL查询所获得的price平均值,然后就可以加入自己的代码进行处理,比如将结果写入本地文件

而New Events和Old Events就是他的输入,而ave(price)操作所计算的对象就是Length Window中的内容。

public class MyListener : UpdateListener {
public void update(EventBean[] newEvents, EventBean[] oldEvents) {
EventBean event = newEvents[0];
Console.WriteLine("avg=" + event.Get("avg(price)"));
}
}

事件窗口也基本类似。

c)批量窗口处理模式

窗口模式是会在每个Event来都触发一次UpdateListener操作,如果每秒Event数量达到很大的话这种方式明显是不行的 CPU消耗会很厉害

批量窗口处理模式正好可以解决这个问题

批量时间窗口模式

select avg(price) from test.OrderEvent.win:time_batch(3 sec)

批量长度窗口模式

select avg(price) from test.OrderEvent.win:length_batch(10)

时间批量模式的操作图如下

上图的时间窗口大小为4s,他会在4s的窗口时间到达以后才将窗口中的内容一起扔给UpdateListener来进行处理,性能相对节约很多,特别是大数据量的情况下。长度批量窗口的处理模式也是类似。

上述窗口模式下内存使用情况又是如何呢?经过本人测试和研究代码发现,它会保留两个窗口的内存使用量,一个保存当前窗口的Events,一个保存上一个窗口的Events,因此在估算一个数据分析程序占用多少内存要看上面监听的EPL语句开的窗口的大小以及数据的TPS,防止内存OOM。

掌握了上面的窗口的概念,后面其他的内容都很好理解了

d) 过滤

where过滤

select avg(price) from test.OrderEvent.win:time_batch(3 sec) where price>10

having过滤

select avg(price) from test.OrderEvent.win:time_batch(3 sec) having price>10

似曾相识啊,执行方式也基本和SQL里的where 和 having差不多。

在EPL里where 是在incoming Events到window之间进行过滤,having是在window到New Eventing之间进行过滤

e)聚合

count

select count(price) from test.OrderEvent.win:time_batch(3 sec) where price>10

sum

select sum(price) from test.OrderEvent.win:time_batch(3 sec) where price>10

group by

select itemName,sum(price) from test.OrderEvent.win:time_batch(3 sec) where price>10 group by itemName

都很简单,了解SQL的都狠容易上手

f) 函数

ESPER默认加载

• System
• System.Collections
• System.Text

支持这些包下的函数方法,例如

select Math.round(sum(price)) from test.OrderEvent.win:time_batch(3 sec) where price>10

它还支持自定义函数,举个例子,做个计算百分比的函数

public class MyUtilityClass{
public static double computePercent(double amount, double total) {
return amount / total * 100;
}
}

配置一下

<esper-configuration
<plugin-singlerow-function name="percent"
function-class="mycompany.MyUtilityClass" function-method="computePercent" />
</esper-configuration>

OK了,可以用了

select percent(price,total) from OrderEvent

总体来说,ESPER的EPL功能非常强大,而且基本和SQL类似,入门容易,构造一个实时数据分析系统比较简单,且维护成本低,新应用进来只需要简单配置一下EPL语句就可以了,方便快捷,对大部分的系统还是比较适合的。

转载于:https://www.cnblogs.com/shanyou/archive/2013/03/02/2940474.html

深入浅出事件流处理NEsper(三)相关推荐

  1. “约见”面试官系列之常见面试题之第六十一篇之IE和DOM事件流(建议收藏)

    什么是"事件流"? 事件流描述的是从页面中接收事件的顺序 事件流的种类: 事件流主要分为三种 事件冒泡流(IE事件流):事件开始时由最具体的元素(文档中嵌套最深的那个节点)接收,然 ...

  2. JS 事件冒泡整理 浏览器的事件流

    JavaScript与HTML的交互通过事件来实现.而浏览器的事件流是一个非常重要的概念.不去讨论那些古老的浏览器有事件捕获与事件冒泡的争议, 只需要知道在DOM2中规定的事件流包括了三个部分,事件捕 ...

  3. addeventlistener事件第三个参数 passive_JS DOM 事件流、事件冒泡

    当一个HTML元素触发一个事件时,该事件会在元素结点与根结点之间的路径传播.传播按顺序分为三个阶段:捕获阶段.目标阶段.冒泡阶段,这个传播过程就是 DOM 事件流. 事件冒泡就是当一个HTML元素出发 ...

  4. 第三天:js中的事件提高篇(事件流,事件对象,事件委托深层次理解)

    目录 前言 一,基础部分 1.1 js监听并绑定事件 1.2 删除事件绑定 二,事件流 2.1 事件流是什么 2.2 事件流模型 2.3 捕获与冒泡具体示例 2.3.1 addEventListene ...

  5. 13前端学习之WebAPI(三):节点操作、事件高级、DOM事件流、事件委托冒泡

    文章目录 一.节点操作: 1. 删除节点: 1.2. 案例:删除留言 2. 赋值(克隆)节点: 3. 案例:动态生成表格: 3.1 案例分析: 3.2 实现: 4. 创建元素的三种方式: 4.1 区别 ...

  6. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...

    关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 2020,实「鼠」不易 2021,「牛」转乾坤 风劲潮涌当扬帆,任重道远须奋蹄! 一.前言 2020.12.23 立 ...

  7. html流动模型,javascript的事件流模型都有什么?

    事件流:当你在页面触发一个点击事件后,页面上不仅仅有一个元素响应该事件而是多个元素响应同一个事件,因为元素是在容器中的.事件发生的顺序就是事件流,不同的浏览器对事件流的处理不同. JavaScript ...

  8. Android微信小程序原理,微信小程序事件流原理解析

    这篇文章主要介绍了微信小程序事件流原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.什么是事件? 事件是视图层到逻辑层的通讯方式: 事件可 ...

  9. 事件模型、事件流(冒泡与捕获)、事件代理

    本文原链接:https://www.cnblogs.com/hngdlxy143/p/9068282.html https://www.jb51.net/article/139997.htm 事件模型 ...

  10. addListener添加事件监听器,第三个参数useCapture (Boolean) 的作用

    addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click"):第二个参数表示要接收事件处理的函数:第三个参数为 useCapture,本文 ...

最新文章

  1. python mysql 驱动安装
  2. 程序员别只顾着敲代码了,看看吧
  3. 谨慎对待switch,用Object对象替换switch
  4. 6675温度波动大_温度和压力对压缩空气干燥机性能的影响
  5. Hard Disk Drive HDU - 4788——24行代码AC,解题报告
  6. java ajax定义_Ajax的定义
  7. python第k序元素查找列表_【Python】第8次练习:列表——程序填空题 -合并队列、列表元素零的移动、列表逆序输出、第K序元素查找...
  8. (转)淘淘商城系列——商品搜索功能测试
  9. 智慧医疗何去何从?阿里云和行行查联合发布了《2021年中国智慧医疗行业白皮书》
  10. ceb怎么转换成word_如何将ceb文件转成word_ceb文件转成word的详细步骤-系统城
  11. 计算机基础考试题库(含答案)
  12. linux可以用什么c语言编译器,嵌入式Linux下最常用的C语言编译器GCC命令详解
  13. jenkins插件镜像源
  14. 利用Qgis获取天地图矢量数据
  15. 盘点面试中常见的智力题
  16. 天若OCR文字识别本地版
  17. Oracle Analyze 命令 详解
  18. Linux Windows 的Tensorflow 配置: Nvidia 老显卡运算能力低于3.0
  19. linux-计算机基础
  20. Nginx 更新静态页面 不生效

热门文章

  1. 广播接收器动态静态注册
  2. spring3.0注解定时任务配置及说明
  3. android selector 开始自定义样式
  4. 企业生产一线管理应找怎样的好帮手?
  5. windows下用notepad++配置go语言开发环境
  6. windows 2003下配置IIS6为iis5方式的隔离模式运行
  7. 发现一个HTML Form提交的小问题,不知道大家是不是都注意到了
  8. Docker的思想来自于集装箱
  9. 如何将 UbuntuServer 安全的升级
  10. 面试官:select......for update会锁表还是锁行?