美團點評酒旅運營需求在離線場景下,已經獲得了較爲系統化的支持,經過對離線數據收集、挖掘,可對目標用戶進行T+1觸達,經過向目標用戶發送Push等多種方式,在必定程度上提升轉化率。但T+1自己的延遲性會致使用戶在產生特定行爲時不能被實時觸達,沒法充分發揮數據的價值,取得更優的運營效果。算法
在此背景下,運營業務須要着手挖掘用戶行爲實時數據,如實時瀏覽、下單、退款、搜索等,對知足運營需求用戶進行實時觸達,最大化運營活動效果。數據庫
在運營實時觸達需求中,存在以下具備表明性的業務場景:併發
- 用戶在30分鐘內發生A行爲次數大於等於3次
- 用戶爲美團酒店老客,即用戶曾購買過美團酒店產品
- 用戶在A行爲前24小時內未發生B行爲
- 用戶在A行爲後30分鐘內未發生B行爲(排除30分鐘內用戶自發產生B行爲的影響,下降對結果形成的誤差)
本文以該典型實時運營場景爲例,圍繞如何設計出可支撐業務需求高效、穩定運行的系統進行展開。異步
運營實時觸達需求早期活動數量較少,咱們經過爲每一個需求開發一套Storm拓撲相關代碼、將運營活動規則硬編碼這一「短平快」的方式,對運營實時觸達需求進行快速支持,如圖1所示:分佈式
早期方案是一種Case By Case的解決方式,不能造成一個完整的系統。隨着實時運營業務開展,相關運營活動數量激增,線上維護着多套類似代碼,一方面破壞了DRY(Don't Repeat Yourself)原則,另外一方面線上維護成本也呈線性增加,系統逐漸沒法支撐當前的需求。函數
爲解決早期方案中出現的問題,對系統建設提出瞭如下挑戰:高併發
針對以上挑戰,結合業務規則特色,美團點評數據智能團隊調研並設計了酒旅運營實時觸達系統。學習
提升靈活度須要從業務規則和系統代碼解耦和入手,規則和代碼耦合直接致使了重複代碼增多、業務規則修改困難等問題。那如何將業務規則和系統代碼解耦和呢?咱們想到使用規則引擎解決這一問題。測試
規則引擎是處理複雜規則集合的引擎。經過輸入一些基礎事件,以推演或者概括等方式,獲得最終的執行結果。規則引擎的核心做用在於將複雜、易變的規則從系統中抽離出來,由靈活可變的規則來描述業務需求。因爲不少業務場景,包括酒旅運營實時觸達場景,規則處理的輸入或觸發條件是事件,且事件間有依賴或時序的關係,因此規則引擎常常和CEP(複合事件處理)結合起來使用。大數據
CEP經過對多個簡單事件進行組合分析、處理,利用事件的相互關係,找出有意義的事件,從而得出結論。文章最前面背景中提到的業務場景,經過屢次規則處理,將單一事件組合成具備業務含義的複合事件,進而提升該類僅瀏覽未下單的用戶的下單機率。能夠看出,規則引擎及CEP能夠知足業務場景的具體需求,將其引入能夠提升系統面對需求變化的靈活度。
在設計規則引擎前,咱們對業界已有的規則引擎,主要包括Esper和Drools,進行了調研。
Esper設計目標爲CEP的輕量級解決方案,能夠方便的嵌入服務中,提供CEP功能。
優點
劣勢
Drools開始於規則引擎,後引入Drools Fusion模塊提供CEP的功能。
優點
劣勢
因爲業務規則對時間窗功能及定時觸達功能有較強的依賴,綜合以上兩種規則引擎的優劣勢,咱們選用了相對SpEL更爲輕量的表達式引擎Aviator,將流式數據處理及規則引擎集成至Storm中,由Storm保證系統在數據處理時的吞吐量,在系統處理資源出現瓶頸時,可在公司託管平臺上調整Worker及Executor數量,下降系統水平擴展所需成本。
肯定引入規則引擎後,圍繞規則引擎的設計開發成爲了系統建設的主要着力點。經過使用實時數據倉庫中的用戶實時行爲數據,按業務運營活動規則,組合成有意義的複合事件,交由下游運營業務系統對事件的主體,也就是用戶進行觸達。將系統抽象爲如下功能模塊,如圖2所示:
整體來看,系統組成模塊及功能以下:
其中,規則引擎由核心組件構成的最小功能集及擴展組件提供的擴展功能組成。因爲規則引擎解耦了業務規則和系統代碼,使得實時數據在處理時變的抽象,對數據監控、報警提出了更高的要求。下面咱們將從規則引擎核心組件、規則引擎擴展組件、監控與報警三個方面分別進行介紹。
規則引擎核心組件爲構成規則引擎的最小集合,用以支持完成基礎規則判斷。
引入規則引擎後,業務需求被轉換爲具體場景和規則進行執行,如圖3所示:
規則引擎在執行規則過程當中,涉及如下數據模型:
時間窗模塊是酒旅運營實時觸達系統規則引擎中的重要構成部分,爲規則引擎提供時間窗因子。時間窗因子可用於統計時間窗口內瀏覽行爲發生的次數、查詢首次下單時間等,表1中列舉了在運營實時觸達活動中須要支持的時間窗因子類型:
類型 | 示例 | 因子構成 |
---|---|---|
count | 近X分鐘瀏覽POI大於Y次 | count(timeWindow(event.id, event.userId, X * 60)) |
distinct count | 近X分鐘瀏覽不一樣POI大於Y次 | count(distinct(timeWindow(event.id, event.userId, X * 60))) |
first | 近X天支付的首單酒店 | first(timeWindow(event.id, event.userId, X * 60)) |
last | 近X天最後一次搜索的酒店 | last(timeWindow(event.id, event.userId, X * 60)) |
表1 時間窗因子類型
根據時間窗因子類型能夠看出,時間窗因子有如下特色:
對於以上特色,在評估使用場景和接入數據量級的基礎上,咱們選擇公司基於Tair研發的KV的存儲服務Cellar存儲時間窗數據,經測試其在20K QPS請求下,TP99能保證在2ms左右,且存儲方面性價比較高,能夠知足系統需求。
在實際運營活動中,對時間窗內用戶某種行爲次數的判斷每每在5次之內,結合此業務場景,同時爲避免Value過大影響讀寫響應時間,在更新時間窗數據時設置閾值,對超出閾值部分進行截斷。時間窗數據更新及截斷流程如圖4所示:
文章最前面背景中提到的業務場景,在1. 用戶在30分鐘內發生A行爲次數大於等於3次
、3. 用戶在A行爲前24小時內未發生B行爲
、4. 用戶在A行爲後30分鐘內未發生B行爲(排除30分鐘內用戶自發產生B行爲的影響,下降對結果形成的誤差)
中,均使用了時間窗模塊對滑動時間窗內的用戶行爲進行了統計,以時間窗因子做爲規則執行判斷的依據。
規則引擎擴展組件在覈心組件的基礎上,加強規則引擎功能。
自定義函數能夠擴充Aviator功能,規則引擎可經過自定義函數執行因子及規則條件,如調用用戶畫像等第三方服務。系統內爲支持運營需求擴展的部分自定義函數如表2所示:
名稱 | 示例 | 含義 |
---|---|---|
equals | equals(message.orderType, 0) | 判斷訂單類型是否爲0 |
filter | filter(browseList, 'source', 'dp') | 過濾點評側瀏覽列表數據 |
poiPortrait | poiPortrait(message.poiId) | 根據poiId獲取商戶畫像數據,如商戶星級屬性 |
userPortrait | userPortrait(message.userId) | 根據userId獲取用戶畫像數據,如用戶常住地城市、用戶新老客屬性 |
userBlackList | userBlackList(message.userId) | 根據userId判斷用戶是否爲黑名單用戶 |
表2 自定義函數示例
文章最前面背景中提到的業務場景,在2. 用戶爲美團酒店老客,即用戶曾購買過美團酒店產品
中,判斷用戶是否爲美團酒店老客,就用到了自定義函數,調用用戶畫像服務,經過用戶畫像標籤進行斷定。
定時觸達模塊支持爲規則設定定時執行時間,延後某些規則的執行以知足運營活動規則。文章最前面背景中提到的業務場景,在4. 用戶在A行爲後30分鐘內未發生B行爲(排除30分鐘內用戶自發產生B行爲的影響,下降對結果形成的誤差)
條件中,須要在A行爲發生30分鐘後,對用戶是否發生B行爲進行斷定,以排除用戶自發產生B行爲對活動效果形成的影響。
定時觸達模塊涉及的數據流圖如圖5所示:
早期的業務需求對延遲時間要求較短,且活動總數量較小,經過維護純內存DelayQueue的方式,支持定時觸達需求。隨着相關運營活動數量增多及定時觸達時間的延長,純內存方式對內存的佔用量愈來愈大,且在系統重啓後定時數據會所有丟失。在對解決方案進行優化時,瞭解到公司消息中間件組在Mafka消息隊列中支持消息粒度延遲,很是貼合咱們的使用場景,所以採用此特性,代替純內存方式,實現定時觸達模塊。
對比離線數據,實時數據在使用過程當中出現問題不易感知。因爲系統針對的運營活動直接面向C端,在出現系統異常或數據質量異常時,若是沒有及時發現,將會直接形成運營成本浪費,嚴重影響活動轉化率等活動效果評估指標。針對系統穩定性問題,咱們從監控與報警兩個角度入手解決。
利用公司數據平臺現有產品,對系統處理的實時事件按其事件ID上報,以時間粒度聚合,數據上報後可實時查看各種事件量,經過消息量評估活動規則和活動效果是否正常,上報數據展現效果如圖6所示:
監控只能做爲Dashboard供展現及查看,沒法實現自動化報警。因爲用於監控所上報的聚合數據存儲於時序數據庫OpenTSDB中,咱們基於OpenTSDB開放的HTTP API,定製報警模塊,定時調度、拉取數據,對不一樣事件,按事件量級、活動重要性等指標,應用環比、絕對值等不一樣報警規則及閾值。超出設定閾值後,經過公司IM及時發送報警信息。如圖7所示,該事件環比出現數據量級降低,收到報警後相關負責人可及時跟蹤問題:
酒旅運營實時觸達系統已上線穩定運行一年多時間,是運營業務中十分重要的環節,起到承上啓下的做用,在系統處理能力及對業務貢獻方面取得了較好的效果:
當前系統雖然已解決了業務需求,但仍存在一些實際痛點:
展望將來,在解決痛點方面咱們還有不少路要走,將來會繼續從技術及業務兩方面入手,將系統建設的更加易用、高效。
曉星,美團平臺技術部-數據中心-數據智能組系統工程師,2014年畢業於北京理工大學,從事Java後臺系統及數據服務建設。2017年加入美團點評,從事大數據處理相關工做。
偉彬,美團平臺技術部-數據中心-數據智能組系統工程師,2015年畢業於大連理工大學,同年加入美團點評,專一於大數據處理技術與高併發服務。
最後發個廣告,美團平臺技術部-數據中心-數據智能組長期招聘數據挖掘算法、大數據系統開發、Java後臺開發方面的人才,有興趣的同窗能夠發送簡歷到lishangqiang#meituan.com。
若是對咱們團隊感興趣,能夠關注咱們的專欄。