前面对Esper进行了概述,包括事件类型、事件流、事件窗口以及EPL相关内容。当然,上面的知识,对于简单的Esper开发,应该已经足够,能够根据自己业务需求,做出一个满足需要的Esper应用。但是,真正对Esper的工作原理能够了解多少呢?
OK,下面就对Esper的工作原理进行一个简单的描述。首先看一下Esper的事件驱动架构图:
整个EDA(Event Driven Architecture)包括:
· data streams :事件源,提供高速、海量的实时数据。
· Event Stream adapters : 事件源的接入适配器,用于接收事件源数据,并且转发事件给Esper引擎。
· Esper engine : Esper引擎部分。其负责注册statement以及statement的监听、事件类型等信息,执行事件处理。
· output adapters : 输出适配器,通过监听等获取引擎处理的有价值信息,通过该适配器输出。换句话说,其实就是与引擎外包程序连接的入口。
· Event Query & Causality Pattern Language : 事件处理语言,包括规则引擎(事件查询语言 类SQL的用法) 以及状态引擎(模式匹配)的定义。Esper引擎执行事件处理时,依赖这些引擎的定义。
· Core container : 核心容器。特殊算法、操作分析等。
· HistorycalData access layer : 历史数据访问层。在引擎处理时,会将Esper引擎处理views的历史数据(比如时间窗口 取过去30s的平均值)此类用法时,保存历史数据,共引擎处理。
整个Esper架构——轻量级的ESP(Event Stream processing 事件流处理)和CEP(Complex Event Processing 复合事件处理)容器,由以上各个部分组成。
运行时,event steam的流转,参考图中的箭头方向。
还可以参考如下图:
上图中,通过事件处理总线,即接入adapter以及引擎注册等,负责接收事件并交由引擎处理;引擎处理的过程需要借助Esper的内部缓存以及状态引擎、规则引擎等对事件进行解析、筛选处理。引擎处理输出的事件信息、历史数据等都会在内部缓存中进行保存。最后事件消费方获取有价值数据,执行相应动作。(这一部分的解释多少有点模糊,是因为对于图中的箭头流向有些疑问,解释不够清楚,还请谅解!)
注:上述图片均来自网络,在此感谢原图作者,并致以歉意!