CEP的概念:
Ø複雜事件處理(Complex Event Processing),用於識別輸入流中符合指定規則的事件,並按照指定方式輸出。
Ø起床—>洗漱—>吃飯—>上班一系列串聯起來的事件流形成的模式
Ø瀏覽商品—>加入購物車—>建立訂單—>支付完成—>發貨—>收貨事件流形成的模式。
透過概念可以瞭解,CEP主要是識別輸入流中使用者指定的一些基本規則的事件,然後將這些事件再透過指定方式輸出。
如下圖所示: 我們指定“方塊、圓”為基本規則的事件,在輸入的原始流中,將這些事件作為一個結果流輸出來。
CEP的使用場景:
像使用者異常檢測:我們指定異常操作事件為要輸出的結果流;策略營銷:指定符合要求的事件為結果流;運維監控:指定一定範圍的指標為結果流;銀行卡盜刷:指定同一時刻在兩個地方被刷兩次為異常結果流。
在Flink CEP API中,主要透過Pattern 類來進行實現。CEP模式主要分為三種模式:
1、個體模式
Ø單例模式:只接收一個事件
p 觸發條件 (。where()/。or()/。until())
Ø迴圈模式:可以接收一個或多個事件
p單例 +量詞(在個體模式後追加量詞,指定迴圈次數)
個體模式分為單例模式和迴圈模式:
單例模式只接收一個事件,主要透過(。where()/。or()/。until())等條件觸發,使用規則如下:start為定義的變數。
迴圈模式可以接收一個或多個事件,使用規則為 單例+量詞,如下圖所示:
2、組合模式(多個個體模式的組合)
Ø嚴格連續(next)
Ø中間沒有任何不匹配的事件
Ø寬鬆連續(followBy)
Ø忽略匹配的事件之間的不匹配的事件
Ø不確定的寬鬆連續(followByAny)
Ø一個匹配的事件能夠再次使用
組合模式主要分為
三種使用規則:
但是在使用組合模式之前,必須以初始模式開始,使用begin() 控制,如下圖:
(1)嚴格連續,透過next()方法控制,這句話是指使用者定義的基本事件,如最上圖中的方塊,必須是連續都是方塊,不能出圓圈。可以透過下圖理解。
(2)寬鬆連續,透過followBy()控制,中間可以有不匹配的事件
(3)不確定的寬鬆連續,透過followByAny()方法控制,表示一個匹配的事件可以多次被使用
組合模式還包含:“不希望出現某種連續關係”:
。notNext()—— 不想讓某個事件嚴格近鄰前一個事件發生
。notFollowedBy()——不想讓某個事件在兩個事件之間發生
組合模式注意事項:
所有組合模式必須以。begin()開始;組合模式不能以。notFollowedBy()結束;“not”型別的模式不能被optional所修飾;此外,還可以為模式指定時間約束,用來要求在多長時間內匹配有效。
3、模式組
Ø一個組合模式作為條件巢狀在個體模式裡pPattern((ab)c)
為例幫助大家更好地理解CEP的API使用,接下里透過兩個案例,對CEP的使用進行講解。
(a)電商案例——條件建立訂單之後15分鐘之內一定要付款,否則取消訂單
案例介紹:在電商系統當中,經常會發現有些訂單下單之後沒有支付,就會有一個倒計時的時間值,提示你在15分鐘內完成支付,如果沒有完成支付,那麼該訂單就會被取消,主要是因為拍下訂單就會減庫存,但是如果一直沒有支付,那麼就會造成庫存沒有了,後面購買的時候買不到。
在CEP概念介紹時,引入過一條鏈路:
Ø瀏覽商品—>加入購物車—>建立訂單—>支付完成—>發貨—>收貨事件流形成的模式。
上述模式是標準的電商事件流,我們案例中定義的CEP規則是
建立訂單—>支付完成 這兩個環節,要求是,判斷15分鐘內是否付款,否則訂單取消。
程式碼設計:
Ø(1)定義實體類:訂單編號,訂單狀態(1 建立訂單,等待支付,2支付訂單完成,3取消訂單,申請退款,4已發貨,5確認收貨,已經完成)訂單建立時間,訂單金額
Ø(2)建立執行環境,設定流時間特性為事件時間,設定並行度
Ø(3)設定Source源
Ø(4)定義Pattern模式,指定條件
在Pattern模式中,我們使用到了個體模式,組合模式
首先,使用begin()方法以模式作為開始;
其次,由於建立的CEP規則是 建立訂單—>支付完成 ,則在單例模式下,透過where條 件觸發訂單的狀態已將處於 1 建立訂單,等待支付狀態
接著,透過寬鬆連續followBy()方法忽略15分鐘內的產生的其他訂單,所以使用寬鬆連續。
然後,透過where條件觸發訂單的狀態是否已將處於 2 支付完成。
最後,透過within()方法判斷第二次觸發的訂單是否在支付的15分鐘內完成。
Ø(5)訂單超時檢測
Ø(6)執行結果對比
檢視最終的執行結果,可以得知201608041140。。。。 這個訂單的狀態為1,且沒有其他狀態,最終被系統判斷為超時訂單。
(b)系統登入案例——當2秒內出現兩次登入失敗(“fail”)時,輸出異常報警資訊
同樣,根據上述資訊,我們做以下程式碼設計:
Ø(1)設定實體類:使用者ID,登入IP,事件型別,事件時間
Ø(2)設定環境,指定source源,傳入實體類
Ø(3)定義pattern匹配模式(規則),指定條件
begin: 第一次;where: 出現 fail;next: 緊接著第二次出現 fail;times: 出現一次 ;within:表示在2秒內。
Ø(4)結果對比
檢視最終的執行結果,可以得知伺服器編號為1,連續2秒在兩個伺服器登入,登入失敗;伺服器編號為3,連續2秒在一臺伺服器登入,登入失敗!
以上就是CEP的講解內容!覺得好的,點贊,在看,分享三連擊,謝謝!!!
為回饋廣大計算機愛好者,本博主專門整理了關於Java、大資料、演算法、前端、人工智慧、作業系統、網路等所學知識的書籍,如果看到此博文的小夥伴們,覺得對你有幫助,請關注微信公眾號:
3分鐘秒懂大資料
,回覆:
福利
。就快速領取吧!