深入浅出事件流处理NEsper(三)

简介:

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

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

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

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

nesper


02212642-e057c8da962b40788abdf5f00c34bb4

接下来对上述结构图进行详细的解释让大家加深对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的平均值
以上这些都比较容易理解,虽然知道了处理方法,也比较好用,我还是比较喜欢钻研一下他的内部实现方式。先来看一张时间窗口模式的图


02212648-e478535559cd4073bf8a94200dc4b0c

他仅保留最近时间窗口的对象内容,但是每个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消耗会很厉害

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


02212653-f23a3940749d4e419a195ee6f19d683

上图的时间窗口大小为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语句就可以了,方便快捷,对大部分的系统还是比较适合的。

本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

目录
相关文章
|
8月前
|
存储 缓存 JavaScript
深入浅出 RxJS 核心原理(响应式编程篇)
在最近的项目中,我们面临了一个需求:监听异步数据的更新,并及时通知相关的组件模块进行相应的处理。传统的事件监听和回调函数方式可能无法满足我们的需求,因此决定采用响应式编程的方法来解决这个问题。在实现过程中发现 RxJS 这个响应式编程库,可以很高效、可维护地实现数据的监听和组件通知。
163 0
深入浅出 RxJS 核心原理(响应式编程篇)
|
2月前
|
消息中间件 存储 Apache
精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的事务性消息的底层原理并在分析其实际开发场景
事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。
360 2
精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的事务性消息的底层原理并在分析其实际开发场景
|
存储 前端开发 Dubbo
响应式编程的实践
响应式编程的实践
响应式编程的实践
|
数据采集 消息中间件 XML
【Esper技术专题】一个简单的事件响应功能的案例(2)复杂事件处理引擎
【Esper技术专题】一个简单的事件响应功能的案例(2)复杂事件处理引擎
244 0
|
Java
【Esper技术专题】针对于Esper事件驱动框架的数据模型分析| 8月更文挑战
【Esper技术专题】针对于Esper事件驱动框架的数据模型分析| 8月更文挑战
209 0
|
弹性计算 数据可视化 API
EventBridge 事件领域重点特性介绍(一)| 学习笔记
快速学习 EventBridge事件领域重点特性介绍。
161 0
EventBridge 事件领域重点特性介绍(一)| 学习笔记
|
JSON 监控 机器人
EventBridge 事件领域重点特性介绍(二)| 学习笔记
快速学习 EventBridge事件领域重点特性介绍。
140 0
EventBridge 事件领域重点特性介绍(二)| 学习笔记
|
JavaScript 前端开发
【重温基础】20.事件
【重温基础】20.事件
103 0
|
消息中间件 Java 微服务
消息队列面试解析系列(六)- 异步编程妙用(下)
消息队列面试解析系列(六)- 异步编程妙用
145 0

热门文章

最新文章