about云開發

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

打印 上一主題 下一主題

[介紹解說] 閑魚如何打造高效CEP系統及DSL編程語言

[復制鏈接]
跳轉到指定樓層
樓主
a87758133 發表于 2019-11-4 22:14:36 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 a87758133 于 2019-11-4 22:22 編輯

問題導讀


1.CEP系統的構建思路是怎樣的?
2.主流開源CEP技術框架有哪些?
3.閑魚CEP系統如何設計實現?



背景
復雜事件處理(Complex Event Processing,以下簡稱CEP)是一種分析事件流的技術,事件可以是事物有意義的狀態變化也可以是事物之間的動作。主要用于分析事件之間的關聯關系,且這種關聯關系在時間上是多種多樣的。

在閑魚內部,需要處理復雜事件的場景逐漸增多。比如:1. 安全治理領域:用戶N分鐘內發送圖片或文字消息給M個人,標記該用戶。賣家發布商品,買家快速拍下商品。 M小時內,同一買家超過K次。標記該買家。2. 營銷領域:12小時內,買家查看商品詳情,賣家降價商品。給買家發送降價push。這些需求常常多變的,而且需要快速上線驗證,如何提升開發效率同時滿足事件計算的及時性、可靠性、穩定性成為擺在閑魚面前的一大問題。

CEP系統的構建思路
CEP技術是一項歷史比較久的技術,早年就被應用于很多計算機領域-比如應用于無線射頻識別(Radio Frequency Identification,RFID)領域的的事件監控預警。對閑魚來應用場景來說,總結核心訴求如下:
1. 需要滿足常見的計算需求:需要考慮事件序列、窗口聚合、事件過濾、模式匹配計算場景。
2. 開發效率:需求常常是多變的,要求可以低成本開發快速上線。
3. 性能:閑魚存在海量的用戶行為數據以及各種預定義事件,要求千萬級/秒的事件處理吞吐量,秒級延遲。
4. 容錯性:數據不可丟,計算不可以出錯,出現錯誤后系統可自動恢復。
5. 云端聯動:有一些簡單計算場景可以直接在端上實現掉,提升響應性能。只有復雜場景才需要在服務端計算實現。
6. 能夠解決大部分計算場景就可以了,不需要為了一些非常少見的場景去設計特別復雜的機制。

主流開源CEP技術框架
目前主流的CEP技術花樣繁多,各成體系,我們調研了業內主流開源技術方案做了一些比較:


閑魚CEP系統的思路
調研眾多技術方案和參考相關論文后,閑魚決定采用如下的方式構建CEP系統:
1. 標準化事件的輸入與輸出,這樣可以大幅度降低系統的復雜性。輸出事件寫入消息服務中供使用方訂閱。
2. 為了簡化開發工作,同時統一云和端的匹配規則表達,參考業內論文,我們決定自定義一種簡單的DSL語言來描述規則。該語言應該類似SQL,由有限的關鍵字組成,讓普通開發者一看就懂,同時有足夠的表達能力覆蓋大部分閑魚CEP計算場景。
3. 關于計算引擎的選擇:考慮到系統需要處理海量的用戶行為數據,對性能、實時性、容錯性的嚴苛要求以及人員技術熟悉情況。選擇阿里內部較為成熟Blink(開源版本叫Flink)實時計算框架作為底層計算引擎。
設計實現
輸入輸出
整個系統本質上是一個數據處理系統,自然首先需要定義的事情就是:輸入與輸出。
我們抽象了閑魚的常見的用戶行為和動作,作為基本事件,并把這些基本事件標準化。這些基本事件可以看作是我們CEP計算的輸入,由基本事件匹配生成的結果可以看作是輸出事件。1. 事件標準化輸入:

[Plain Text] 純文本查看 復制代碼
輸入樣例:        
event_code:  S_SEND_MSG        
event_time:  2019-09-24 10:15:23.474        
extra_info:  {"to_user":"ccc","ARG3":"0",        
              "SDKTYPE":"mini","UTPVID_T":"156*****104","ARG1":"xchat",        
              "chat_session_type":"1","APPKEY":"***","EVENTID":"***",        
              "PAGE":"UT","_priority":"4","chat_session_id":"*****",        
              "content_type":"1",        
              "text":"******"}        
user_id:  abc


2. 事件的標準化輸出:默認輸出到消息服務中。消息體是由輸出字段組成的json kv結構
[Plain Text] 純文本查看 復制代碼
輸入樣例:        
{"user_id":"abc","event_time":"2019-09-24 10:15:23"}


運行架構


我們定義了一種簡單的DSL語言來表達事件處理規則,有了DSL,用戶可以像使用普通的數據庫一樣編寫DSL,然后提交給系統自動運行該DSL語言,運行該DSL的系統持續的監聽輸入數據做實時匹配,并將結果作為輸出事件輸出。Interactive Service:系統對外提交的交互服務。Strean Source:標準化的事件來源,使用阿里云sls存儲。EPL Parser:負責DSL的語法掃描與代碼翻譯,將用戶編寫的DSL解析生成Blink CEP Pattern代碼或者Blink SQL。Job Manager:主要負責將生成的EPL Parser生成的代碼或SQL部署到Blink的任務中,包括生成任務與執行計劃、提交任務、停止任務、啟動任務等等。Sink輸入:事件命中計算規則后生成json格式的輸出事件,存儲到消息服務MetaQ中。


閑魚DSL語言
我們設計DSL語言的第一個原則就是盡量和SQL語法類似,第二原則是要足夠的簡單明了。結合閑魚的使用場景,我們定義的主要語言要素如下:
[Plain Text] 純文本查看 復制代碼
--語言定義        
RULENAME <規則名稱>         --定義規則名稱        
<變量名:事件類型>           --定義事件變量        
EVENT    <事件模式序列>     --定義事件匹配模式        
[WHERE]  <條件表達式>       --定義事件過濾條件        
[REPEAT] <頻次表達式> [SAME] <指定REPEAT重復計數字段> [HAVING] <條件表達式> --定義頻次表達        
[WITHIN] <時間窗口>        --定義匹配事件窗口        
RETUEN   <輸出字段>        --定義輸出事件的字段        
支持場常見內置函數:SUM、COUNT、MAX、MIN、DISTINCT


整個語言的定義比較簡潔,熟悉SQL的同學非常容易理解其所要表達的含義。其特點如下:
1. 簡化了復雜事件處理的表達。
2. 標準化的事件輸入與輸出。
3. 語法與關鍵詞含義類SQL。
4. 統一表達方便云端共用。
5. 只表達事件的處理、觸發計算,包含基本的過濾、聚合、模式匹配。
6. 支持常見SQL聚合函數。
7. 非通用編程語言,不覆蓋所有CEP場景。
編程示例:
[Plain Text] 純文本查看 復制代碼
--用戶,在10分鐘內,發送了相同條消息,給了100不同的用戶。        
RULENAME: "示例"        
e1: S_SEND_MSG        
EVENT  e1        
REPEAT 100+ SAME e1.user_id HAVING DISTINCT(e1.extra_info[received_user_id]) > 100        
WITHIN 10 MINUTE        
RETURN   userId=e1.user_id


DSL語言實現簡介
該DSL語言在端上的實現還在開發中,本文只介紹其在云端的實現方式。由于我們選擇的計算引擎是Blink,自然該語言需要能夠運行在Blink平臺上。Blink底層已經支持CEP計算,其JAVA API說明可參考:https://ci.apache.org/projects/f ... 9/dev/libs/cep.html。在Blink內部是通過NFA(Non-determined Finite Automaton 不確定有限狀態機)來實現CEP技術的,其主要理論依據參考的是論文Efficient Pattern Matching over Event Streams中介紹的模型,有興趣的同學可以參考。

我們知道標準的SQL是可以直接運行在Blink上面的,Blink沒有自己構建一個SQL優化解析器,而是很聰明的選擇了Apache Calcite來實現SQL校驗、SQL解析、抽象語法樹的構建以及SQL優化(底層語法分析實際是通過Javacc實現)。Calcite是一個非常流行的開源SQL實現框架,在很多開源項目中都有應用。這樣Calcite在Blink SQL架構中處于核心地位。閑魚的DSL相當于擴展了Blink的SQL,通過自定義解析器做DSL的解析、校驗同時生成抽象語法樹,然后根據語法樹生成Blink CEP代碼。特別地對于一種簡單場景:只有對一種類型的事件做過濾、聚合計算的情況;我們將其直接翻譯成Blink SQL,因為Blink SQL底層是Stream API比Blink CEP基于NFA的狀態機性能要好。整體架構如下圖所示:


實現流程:
1. 利用calcite定制解析器解析DSL語言,生成類SQL語法樹。
2. 語法正確性校驗。
3. 通過語法正確性校驗生成抽象語法樹。
4. 判斷如果只有一種類型的事件,通過代碼替換模板直接翻譯成Blink SQL 轉7,否則轉5。
5. 翻譯成CEP Pattern API代碼。
6. 添加標準的輸入、輸出Stream,構建完整的運行拓撲圖。
7. 設定任務運行參數。
8. 通過Blink API提交Blink運行。

應用效果
目前該系統已經上線第一個版本,承接了閑魚的安全策略檢查、實時觸達用戶以及玩法場景下的規則實時匹配。生成的匹配結果通過寫入MetaQ供使用方消費。

效率提升:初步驗證實現同樣的規則匹配功能,同編寫JAVA代碼相比使用改DSL語言可以大幅提升開發效率,從接受需求到編寫DSL上線驗證一般30分鐘左右即可完成。
性能:DSL生成的計算任務處理10w左右QPS數據,消耗3個cu,平均延遲1s。
高可靠性:依賴于Blink的高可靠特性,任務的運行自然擁有快速的錯誤恢復機制以及數據亂序處理能力。測試運行效果如下圖所示:

閑魚的CEP計算還在不斷完善中,同時我們在和Blink團隊合作共建該DSL語言,成為Blink應用生態的一部分。計劃成熟后將逐步應用于阿里內部其他BU。

閑魚團隊是Flutter+Dart FaaS前后端一體化新技術的行業領軍者,就是現在!客戶端/服務端java/架構/前端/質量工程師面向社會招聘,base杭州阿里巴巴西溪園區,一起做有創想空間的社區產品、做深度頂級的開源項目,一起拓展技術邊界成就極致!



最新經典文章,歡迎關注公眾號

來源:CSDN

作者:閑魚技術

原文:《閑魚如何打造高效CEP系統及DSL編程語言》

https://blog.csdn.net/weixin_38912070/article/details/102597904?utm_source=app



您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關閉

推薦上一條 /4 下一條

QQ|小黑屋|about云開發-學問論壇|社區 ( 京ICP備12023829號 )

GMT+8, 2019-12-10 19:58 , Processed in 1.156250 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2018 Comsenz Inc.Designed by u179

快速回復 返回頂部 返回列表
排球比赛场地