事件流处理框架NEsper for .NET

复合事件处理(Complex Event Processing)介绍提到了开源的Esper,NEsper 是一个事件流处理(Event Stream Processing,ESP)和复杂事件处理(Complex Event Processing,CEP)的系统,它可以监测事件流并当特定事件发生时触发某些行动——可看作是把数据库反过来,语句是固定的,而数据流进进出出。事件处理是软件行业的一个发展趋势,已有数家大厂商以及许多初创企业加入到该市场中。其常有的应用例子包括系统自动交易、BAM、RFID、高级监测系统、欺诈检测,甚至直接集成进SOA。

微软有个和SQL Server 集成的StreamInsight,但是他不是开源的,开源的NEsper 是StreamInsight之外的另一个选择。虽然StreamInsight集成在SQL Server,但是它可以不需要SQL Server的,工作起来有点像有点像数据库的倒置,Esper 也是一样的。NEsper 引擎允许应用存储查询并运行数据通过,来代替存储数据并且执行查询存储数据的工作方式。NEsper 提供两种机制来处理事件: 1、NEsper 提供了一个事件模式语言去指定基于表达式的事件模式匹配。这个模式匹配引擎是通过一个状态机来实现的。这个事件处理的方法匹配期望存在的队列或者不存在的事件或者事件的组合。它包括以时间为基础的各个事件之间的关系。 2、 NEsper 还提供事件流查询。这个样可以使事件流分析CEP应用的需求。事件流查询提供窗口、聚合、连接和分析的函数来处理事件流。这些查询是通过EPL 语句来实现的(被定制过的事件处理语言(event processing lauguage -- EPL)能够表达丰富的事件条件,相关性,尽可能的时间窗口跨度,因此在为系统开发时最小化了所需的开发精力)。EPL用于视图。视图表示需要将构造的数据放入到一个事件流中并且去驱动数据的流动。在数据流动的过程中对数据进行处理,来得到我们最后所 需要的结果。

EPL与SQL一样使用select从句和where从句。但是EPL语言使用事件流和views(视图)的概念取代了数据库中的表。与SQL语句中的表相似,EPL中的views被定义成了能为查询和过滤的数据。views有对事件进行排序,能从事件属性中得到分析数据,能够给事件分组,以及单独处理事件属性值得等功能。 下面是一个简单的EPL语句,计算了在最近30秒内股票事件流的平均价格。

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

接下来的EPL语句返回了每一个特征类别再100ticks之内的平均价格。

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

下面的例子连接了两个事件流。第一个事件流包含了在30分钟之内进行欺骗警告的事件。第二个事件是在最近30秒内进行退款的事件。这个事件流是通过accout 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

3.事件模式匹配 模式匹配是通过状态机实现的。(NFA、DFA之类的,我是在学编译原理时候学的)。模式的表示能够包含与模式操作相结合的过滤表达。模式表达可以嵌套。 下面是5种类型的模式操作(pattern operators):

(1)控制模式查找器的创建和终结的操作符:every (2)逻辑操作符:and、or、not (3)时态操作符(控制事件顺序):-> (4)where-condition(用于用于事件过滤与模式查找器的终止):比如 timer:at (5)观察者观察的事件时间:比如 timer:interval,timer:at

下面是一个简单的模式,它给在60秒内价格大于80的IBM股票一个警告:

every StockTickEvent(symbol="IBM", price>80) where timer:within(60 seconds)

每隔5分钟发出一次警告:

every timer:at(5, *, *, *, *)

每事件A发生后,接着事件B或者事件C发生:

A -> ( B or C )

一个模式,接下来事件的一个属性需要与第一个事件的该属性匹配:

every a=EventX -> every b=EventY(objectID=a.objectID)

4.模式匹配与事件流分析的结合 当一串事件流被模式进行匹配时,模式匹配的结果能被接下来的分析和处理所应用。下面的模式描述的是在10秒之内一个事件与其接下来的事件的id不同。而这个语句则进一步统计了所有这种情况下的id分组。

select a.id, count(*) from pattern [ every a=Status -> (timer:interval(10 sec) and not Status(id=a.id)] group by id 5.命名窗口(named windows) 命名窗口是一个全局数据窗口,她能够参与许多查询语句,也能被查询、被插入、被删除。命名窗口类似于数据库系统中的表(table)的概念。 接下来我们创建一个命名窗口: create window AlertNamedWindow as (origin string, priority string, alarmNumber long) 命名窗口还可以在事件达到时触发查询、修改、删除。这里举一个统计数字的例子:

on TriggerEvent select count(*) from AlertNamedWindow

通过Esper探索事件驱动架构

Esper专栏介绍 

NEsper for .NET

Esper近况:事件流处理框架

https://bitbucket.org/emertechie/syslognet

http://www.cppblog.com/mysileng/archive/2012/10/11/193182.html

CEP入门

http://blog.csdn.net/luonanqin/article/category/1557469

http://www.copper-blue.com/blog/nesper-cepthe-series-2/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

使用Eclipse插件提高Java编码质量

代码质量概述 ? 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行...

36870
来自专栏平凡文摘

怎样编写高质量的Java代码

17530
来自专栏运维技术迷

Redis单线程架构

redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。 引出单线程模型 开启三个redis-cli客户端同时执行命令 客户端1设置一个字...

54580
来自专栏服务端技术杂谈

如何在2016年成为一个更好的Node.js开发者

本文主要讨论一些进行Node.js开发的最佳实践和建议,这些建议不仅仅适合开发者,还适合那些管理与维护Node.js基础架构的工作人员。遵循本文提供的这些建议,...

31570
来自专栏精讲JAVA

怎样编写高质量的Java代码

代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍...

452100
来自专栏互联网杂技

前端面试题整理

交互设计前端开发 前言: 现在前端面试主要考察以下几个方面: 初级的:html、css、js,jquery,开发工具git的使用,对其他框架稍微了解; 中级的:...

49190
来自专栏Python小屋

Python计算前n个自然数的阶乘和

本文来源于粉丝私信的问题,目的在于计算result = 1!+2!+3!+...+n!,因为代码比较简单,没加注释,有问题可以留言交流。文中给出了2段代码,在实...

50250
来自专栏架构师之路

龙神教你“如何做系统性能优化”

性能优化的目标是什么?不外乎两个: 时间性能:减小系统执行的时间 空间性能:减小系统占用的空间 一、代码优化 做代码优化前,先了解下硬件Cache: (1)C...

30470
来自专栏测试驿栈

Jmeter(九)_获取JDBC响应做接口关联

http://www.cnblogs.com/Zfc-Cjk/p/8295495.html

17040
来自专栏Keegan小钢

App架构经验总结(一)

原文链接:http://keeganlee.me/post/architecture/20160303 版权声明:本文刊载在《程序员》杂志2016年3期,版权归...

24340

扫码关注云+社区

领取腾讯云代金券