Esper——内存计算、事件驱动、SQL支持
教程簡介Esper是一個事件流處理(ESP)和事件關(guān)聯(lián)引擎(CEP的,復(fù)雜事件處理)。Esper的目標(biāo)是針對實時事件驅(qū)動架構(gòu)(EDA)。當(dāng)Esper監(jiān)測到事件流中又符合條件的時間發(fā)生時,即可觸發(fā)PlainOldJavaObjects(POJO)編寫的自定義操作。當(dāng)數(shù)百萬數(shù)量級的事件同時發(fā)生時,我們不可能使用普通的關(guān)系型數(shù)據(jù)庫來存儲和查詢,Esper正是專為這樣的大批量關(guān)聯(lián)事件而設(shè)計的。Esper提供一個定制的事件處理語言(EPL),允許的條件表達(dá)豐富的事件,相關(guān)性,可能跨越時間窗,從而減少開發(fā)工作需要設(shè)置一個系統(tǒng),可以對復(fù)雜的情況作出反應(yīng)。Esper是一個輕量級的Java編寫的內(nèi)核是完全納入任何Java進(jìn)程,JEE應(yīng)用服務(wù)器或基于Java的企業(yè)服務(wù)總線嵌入的。它使應(yīng)用程序的過程中收到的消息或事件的大量快速發(fā)展。介紹事件流和復(fù)雜事件信息是至關(guān)重要的作出明智的決定。
from:https://blog.csdn.net/luonanqin/article/details/9900295
說到Esper,不得不說一下CEP。CEP即Complex Event Process,中文意思就是“復(fù)雜事件處理”。聽起來好像很復(fù)雜,實際上就是基于事件流進(jìn)行數(shù)據(jù)處理,把要分析的數(shù)據(jù)抽象成事件,然后將數(shù)據(jù)發(fā)送到CEP引擎,引擎就會根據(jù)事件的輸入和最初注冊的處理模型,得到事件處理結(jié)果。
CEP是一種標(biāo)準(zhǔn),Esper只是對這個標(biāo)準(zhǔn)的一種開源實現(xiàn)。除了Esper,很多大公司也有類似的商業(yè)軟件,比如IBM,Sybase等等,聽說巨貴無比。CEP的一個重要特點就是他是一個內(nèi)存計算工具和類SQL語句。內(nèi)存計算可以說是一把雙刃劍。好處自不必說,一個字:快!壞處也顯而易見,數(shù)據(jù)有丟失的風(fēng)險,而且還有容量的限制(實時計算其實并不受制于內(nèi)存大小,而是得看如何對實時進(jìn)行定義,也就是具體的業(yè)務(wù)來決定了)。所以如果業(yè)務(wù)不能容忍數(shù)據(jù)丟失,那么高可用方案就必須做好,不過Esper的高可用很不好做,后面我將會說到。
CEP的類SQL語句,可以理解為處理模型的定義與描述。這是運行在CEP引擎中的特殊語句,之所以叫他類SQL,是因為它和SQL確實很像,除了select,insert,delete,update,而且也有avg,count等函數(shù)。所以對于會SQL的人來說,他的語法結(jié)構(gòu)大致還是能猜出一二的。在Esper中,這個句子叫做EPL,即Event Process Language。作為Esper的核心內(nèi)容,對于它的講解有三四百頁的英文文檔,所以之后我會慢慢向大家細(xì)細(xì)說明的。
復(fù)雜事件處理引擎—Esper入門(第二彈)
from:https://www.cnblogs.com/aking1988/p/3281649.html
說明:
以下內(nèi)容,可以參考Esper官方網(wǎng)站《Qucik start &Tutorial 》(順序做了部分調(diào)整)。 PS:因為英語水平有限(大學(xué)期間剛過CET4的英語小盲童一枚),翻譯很爛(自己都感覺不能直視),描述不清的,可以隨時問。一有時間,將給予解釋。
Tutorial (教程)部分
1、簡介 (該部分在入門第一彈中有提起)
Esper是一個事件流處理和事件關(guān)聯(lián)的引擎(CEP,complexeventprocessing復(fù)合事件處理)。作為實時事件驅(qū)動框架,當(dāng)事件流中有事件條件發(fā)生時,Esper能夠觸發(fā)自定義動作(POJO)。Esper也是為了大量事件關(guān)聯(lián)而設(shè)計,當(dāng)有數(shù)百萬的事件進(jìn)來時,不能用經(jīng)典的數(shù)據(jù)庫架構(gòu)來存儲所有事件。
定制的事件處理語言EPL,允許表達(dá)豐富的事件條件、關(guān)聯(lián)性,也可跨越事件窗口,從而最大限度的減少為應(yīng)對復(fù)雜情況而必須建立系統(tǒng)的開發(fā)難度。
Esper是輕量級的java內(nèi)核實現(xiàn),其可以完全嵌入到任何的java進(jìn)程、javaEE應(yīng)用服務(wù)器或者給予java的ESB(企業(yè)服務(wù)總線)。Esper可以很快完成傳入的大量消息或者事件處理的應(yīng)用程序。
【總結(jié)】Esper是一個事件處理和復(fù)雜事件關(guān)聯(lián)處理的java內(nèi)核的輕量級引擎。對于大量事件的處理,能夠用最短的時間做出反應(yīng),觸發(fā)相應(yīng)的操作。另外,為Esper量身定制的事件處理語言——類SQL語言,對于表達(dá)事件的條件以及關(guān)聯(lián)關(guān)系的處理等非常方便。
2、事件流和復(fù)雜事件
信息對于作出明智的選擇是至關(guān)重要的。不僅現(xiàn)實生活中這是事實,而且在計算機(jī)處理中尤其是一些領(lǐng)域,比如金融、欺詐檢測、商業(yè)智能或是戰(zhàn)場操作等,也是很重要的。信息從不同的來源,以消息或者事件的形式流動,如股票價格在某一特定時間的狀態(tài)需要給出一個提示。也就是說,看離散的數(shù)據(jù)大部分時間是沒有意義的。交易者需要看到一段時間的股票走勢,以便結(jié)合其他信息在合適的時間做出最好的交易。
一條一條的離散事件是沒有意義的,事件流——一個無限的事件集合——可認(rèn)為是一個滑動的窗口,進(jìn)一步關(guān)聯(lián)是非常有意義的,并用最小的延遲對事件做出反應(yīng),對有效行動和競爭優(yōu)勢是至關(guān)重要的。
【總結(jié)】事件流其實一個個離散的事件串接而成。現(xiàn)實中對于事件流的監(jiān)控或者處理,比如股票信息等,需要實時性的計算其走勢,以便能夠及時的獲取有價值數(shù)據(jù)。事件流在Esper中是一個滑動的窗口,對事件關(guān)聯(lián)處理等至關(guān)重要。
3、Esper
關(guān)系型數(shù)據(jù)庫或者基于消息的系統(tǒng)比如JMS,真的很難處理時間數(shù)據(jù)和實時查詢。事實上,數(shù)據(jù)庫需要一個明確的查詢來返回有意義的數(shù)據(jù),并且在數(shù)據(jù)放生變化時不適合推送數(shù)據(jù)。JMS系統(tǒng)是無狀態(tài)的,需要開發(fā)人員自己實現(xiàn)這個時間和聚合的邏輯。相比之下,Esper提供了更高的抽象和智能,可以認(rèn)為是數(shù)據(jù)庫的倒置:不是存儲數(shù)據(jù),而是對存儲的數(shù)據(jù)運行查詢,Esper允許應(yīng)用程序存儲查詢,并讓數(shù)據(jù)運行通過。當(dāng)滿足查詢的條件發(fā)生時,Esper會做出實時的響應(yīng)。執(zhí)行模塊是持續(xù)的,而不是只有在查詢提交的時候。這個概念是EDA(事件驅(qū)動架構(gòu))的關(guān)鍵基礎(chǔ),在過去的10年,甚至更久都一直在積極的研究。然而,現(xiàn)實中對該系統(tǒng)重要性的認(rèn)知最近才開始出現(xiàn)。
在Esper中,定制的EPL允許在引擎中注冊查詢。監(jiān)聽類(POJO類)會在事件滿足EPL條件的時候由引擎進(jìn)行調(diào)用。EPL能夠表達(dá)復(fù)雜的匹配條件,包括事件窗口、事件流關(guān)聯(lián)、過濾、聚合以及排序等。Esperstatement也可以通過“followedby”即“->”條件從多個簡單的事件中獲取復(fù)雜事件。事件可以被描述成JavaBean類、傳統(tǒng)的java類、XML或者是Map,作為消息發(fā)布者,促進(jìn)重用現(xiàn)有的系統(tǒng)。
【總結(jié)】在處理實時性的數(shù)據(jù)時,比如心跳監(jiān)控、股票價格走勢等,Esper相對于關(guān)系型數(shù)據(jù)庫有天然的優(yōu)勢,Esper不需要對完成的數(shù)據(jù)的存儲,便可以完成數(shù)據(jù)的實時查詢處理,從這點看,更像是數(shù)據(jù)庫的倒置——試想一下,數(shù)據(jù)庫是先存儲數(shù)據(jù),通過編譯解析SQL,完成已存儲數(shù)據(jù)的查詢,Esper則是先編譯EPL語句,形成一個過濾(或處理)層(或者網(wǎng)),實時過來的數(shù)據(jù),通過這個過濾層完成有效事件的篩選或形成有效事件。Esper的事件處理語言——EPL,是類SQL語言,其select語句、from語句、where語句以及groupby、having等,甚至包括大部分的聚合函數(shù)等,都和標(biāo)準(zhǔn)的SQL語言一致。在EPL規(guī)則的編寫上,對于有數(shù)據(jù)庫開發(fā)經(jīng)驗的人來說,上手十分容易。
4、開發(fā)事件驅(qū)動應(yīng)用
用Esper來開發(fā)事件驅(qū)動應(yīng)用并不困難。大概有下面的幾步:
1>通過分析業(yè)務(wù)域和定義探測的情景或者需要報告的信息,定義應(yīng)用程序應(yīng)該完成的功能或任務(wù)。
2>定義性能要求,特別是吞吐量和延遲。
3>確定從什么地方獲取事件。
4>根據(jù)業(yè)務(wù)確定事件格式和事件內(nèi)容。
5>設(shè)計導(dǎo)致復(fù)雜事件的事件關(guān)系。
6>事件源。
7> 設(shè)計事件表示類型:java類、map、或XML等
8>定義EPL語句,用于匹配模式和流的處理。
9> 比如,用CSV適配器作為事件模擬工具,測試檢測場景,或產(chǎn)生加載加載事件。
10>在最終的環(huán)境上,測試吞吐量和延遲。
5、設(shè)計事件表示方式
在Esper當(dāng)中,java類是一種簡單、豐富且通用的事件表示方式。通過接口和超類,java類提供了繼承性和多態(tài)性,通過一個對象graph,就可以表示一個復(fù)雜的業(yè)務(wù)域。Maps或XML也是事件表示的一種方式。
6、事件流分析
EPL語句從一個或者多個事件流中派生和聚合信息,加入或合并事件流,并將一個時間流的結(jié)果提供給后續(xù)的語句。EPL在select語句和where語句的使用上,和SQL很相似。不過EPL語句用事件流和views替換了數(shù)據(jù)庫的表格。和SQL中表格相似,views定義了可用于查詢和過濾的數(shù)據(jù)。Views可以表示為一個事件流上的一個窗口。Views也可以排序事件、從事件屬性獲取統(tǒng)計數(shù)據(jù)、進(jìn)行事件分組或者處理唯一的事件屬性值。
下面的EPL語句用于計算股票事件過去30s的平均價格:
select avg(price) from StockTickEvent.win:time(30 sec)
下面EPL返回的是前100條股票事件的平均值:
select symbol, avg(price) as averagePrice
from StockTickEvent.win:length(100)
group by symbol
下面的例子關(guān)聯(lián)了兩個事件流。第一個事件流由欺詐告警事件組成,用于保存過去30分鐘的事件信息。第二個流則是withdrawal事件,用來保存過去30秒的事件。這兩個流通過accountnumber進(jìn)行關(guān)聯(lián):
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
7、事件模式匹配
Eventpatternsmatchwhenaneventormultipleeventsoccurthatmatchthepattern'sdefinition.
一個或多個事件發(fā)生時,事件模式會匹配定義的模式(很別扭啊⊙﹏⊙b)。模式也可以是基于時間的。模式匹配時通過狀態(tài)機(jī)實現(xiàn)的。
模式表達(dá)式可以由連接了模式操作符的過濾器表達(dá)式組成。通過在圓括號中的嵌入表達(dá)式,可以實現(xiàn)更深的模式表達(dá)式嵌套。
5類操作符:
·控制模式探測器的創(chuàng)建和終止:every
·邏輯操作符:and、or、not
·操作事件順序的時間操作符:-> (緊跟著發(fā)生的,followed by)
·過濾輸出事件的where條件,引起模式探測器的終止:如,timer:within
·和觀察其他事件一樣,觀察者也觀察時間事件,如timer:interval,timer:at
下面是一些EPL的例子:
//模式匹配的是在接下來60秒鐘IBM股票值大于80的所有事件 every StockTickEvent(symbol="IBM", price>80) where timer:within(60 seconds)
//每小時的第5分鐘給出提醒: every timer:at(5, *, *, *, *)
//當(dāng)A事件發(fā)生時,如果后面跟的是B事件或C事件,則給出提醒(輸出A事件) A -> ( B or C )
//匹配的是每一個EventX,如果后跟EventY事件,并且其objectID和EventX的objectID一樣,則給出提醒(輸出a事件): every a=EventX -> every b=EventY(objectID=a.objectID)
8、模式匹配和事件流分析結(jié)合使用
當(dāng)檢測到事件序列(或沒有事件發(fā)生)時,模式就會匹配。模式匹配的結(jié)果可以用于進(jìn)一步的分析和處理。
下面的模式監(jiān)測的是Status事件發(fā)生后的10s沒有相同ID的status事件發(fā)生的場景。整個EPL語句進(jìn)一步計算了所有發(fā)生的每個ID的事件總數(shù)。
select a.id, count(*) from pattern [
every a=Status -> (timer:interval(10 sec) and not Status(id=a.id)
] group by id
9、命名窗口
命名窗口在引擎中是全局的數(shù)據(jù)窗口,其可以參與到很多的語句查詢,并且可以被多個statement執(zhí)行select、insert和delete操作。命名窗口和關(guān)系型數(shù)據(jù)庫系統(tǒng)的表很相似。
通過下面的幾步可以創(chuàng)建命名窗口:
create window AlertNamedWindow as (origin string, priority string, alarmNumber long)
當(dāng)事件到達(dá)時,可以觸發(fā)一個select、update或delete操作。下面是一個select應(yīng)用,簡單的統(tǒng)計數(shù)據(jù)窗口中的記錄行總數(shù):
on TriggerEvent select count(*) from AlertNamedWindow
10、匹配-識別模式匹配(Match-RecognizePatternMatching)
匹配-識別模式是一個基于正則表達(dá)式的模式匹配語法,是建議列入SQL的標(biāo)準(zhǔn)語法。
下面的匹配-識別模式,探測的是可能出現(xiàn)在事件中的模式,這些事件通過命名窗口(如上聲明)保存。這個模式查找的是兩個緊跟的事件,即事件之間沒有相同的origin。第一個事件必須有一個“high”優(yōu)先級,第二個事件必須是“medium”優(yōu)先級。
select * from AlertNamedWindow
match_recognize (
partition by origin
measures a1.origin as origin, a1.alarmNumber as alarmNumber1, a2.alarmNumber as alarmNumber2
pattern (a1 a2)
define
a1 as a1.priority = 'high',
a2 as a2.priority = 'medium'
)
11、變量(Variables)
變量是一個標(biāo)量、對象或者事件值,可用于所有的statement,包括模式。變量可以用在EPL中任意位置的表達(dá)式中。
【總結(jié)】開發(fā)Esper應(yīng)用時,事件類型建議采用Java類,對于事件信息的描述更為直觀(參考<a >Quick Start</a>)。在具有復(fù)雜關(guān)系的事件設(shè)計中,不建議使用Map的方式(可參考<a >Esper參考文檔性能部分</a>)。在EPL設(shè)計時,根據(jù)業(yè)務(wù)需求,如果能通過標(biāo)準(zhǔn)的SQL語法完成的,盡量不要使用匹配模式,因為在運行時,需要對Pattern進(jìn)行額外的解析,其規(guī)則較SQL復(fù)雜,性能上有少許損耗。
數(shù)據(jù)窗口的使用,能夠使得Esper處理更為復(fù)雜的應(yīng)用場景,比如與分布式緩存、靜態(tài)數(shù)據(jù)的使用等。變量不難理解,不管是高級的開發(fā)語言如java、C/C++,還是腳本語言如ruby、JS等,都有變量的概念,其使用范圍,僅限于當(dāng)前的Esper引擎實例。
另外,本節(jié)所描述的信息,如EPL、數(shù)據(jù)窗口等概念會在后續(xù)的更新中詳細(xì)描述。敬請期待!!
注:轉(zhuǎn)載請注明出處! 謝謝!
總結(jié)
以上是生活随笔為你收集整理的Esper——内存计算、事件驱动、SQL支持的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雾霾吸多了会怎样 引起身体肥胖
- 下一篇: 彩蛋是什么意思(电影彩蛋是什么东西)