實時計算部分參考自博文:
用戶標簽系統的用途
用戶分類,精准營銷。
標簽的定義
我司常用的標簽有:新用戶、老用戶、流失用戶、活躍用戶等。此外,還可以根據用戶以往行為,如投訴、訂單取消、查看報價等,為用戶打上相應的標簽。標簽系統提供了從多維度進行用戶分類的方法 。在用戶分類的基礎上,實現差異化營銷、差異化優惠,則可以節約營銷成本。
標簽的時效性
標簽如新用戶、流失用戶等 ,會隨用戶在系統中下單而失效。而活躍用戶會隨着用戶在系統中長期不下單而變成流失用戶。通常,用戶半年以前的行為參考性較低。用戶標簽需要根據用戶近期行為生成。因此,標簽必須與用戶的實際狀態同步,從而不誤導營銷決策。
標簽的使用需求
使用標簽的需求有2種:
- 第一種是給定一個用戶,問用戶是否具有某標簽。在給用戶發放代金券時,用戶標簽可用於決定券的金額、券種。此種情況下,用戶標簽必須是實時的。
- 第二種是給定一些標簽,問具有這些標簽的用戶有哪些。在節假日、重大營銷節點時,可通過為指定特征的用戶集中推送優惠信息,實現促銷。在這種情況下,用戶標簽為准實時即可。
總而言之就是:從用戶角度查詢;從標簽角度查詢
實時計算用戶標簽
為用戶打上標簽本質上是為識別用戶的某種歷史行為特征並標記出來。由於標簽的時效性要求,需要分析用戶近期的行為。因此,我們將用戶的行為作為基本的記錄、分析單位。
一條記錄的例子如下:
用戶Id | 發生時間 | 行為類型 | 訂單Id | 其它 |
---|---|---|---|---|
123 | 2016-10-20 12:10:32 | 取消訂單 | orderId | ..... |
每當用戶進行某個行為時,則為用戶添加一條記錄。為方便實現更多的查詢、搜索擴展,我們把用戶行為數據實時導入到Elasticsearch中。
當計算給定用戶標簽時,從elasticsearch/數據庫中查詢到指定時間段內用戶行為,實時為用戶計算標簽返回。
由於用戶行為是實時導入的,而用戶標簽是根據用戶最新行為記錄生成的,因此生成的標簽具有實效性。由於每個用戶在一段時間內的訂單相關行為數據量不大,因此計算開銷可以忽略。
以上設計的好處在於,我們可以隨時調我們生成標簽所關心的時間段。可以關心最近3個月,或者突然改到半年。而標簽的定義也可以隨時更改。底層是最原始的用戶行為數據,不需要任何改變。
准實時標簽查詢用戶
根據標簽查詢用戶則要困難一些。我們必須提前為每個用戶計算好標簽。才可以根據標簽建立索引,最后實現查詢。在數據量較大的情況下,計算一次可能需要1-2天。如果只在少量時間節點使用此功能,這樣的時間開銷可以接受。
我們考慮如果需要經常使用此功能,如何實現 ?
由於我們已經有了實時計算給定用戶標簽的能力。因此,每當用戶有新的行為時,我們可以重新為此用戶計算標簽,並入庫。系統運行一段時間之后,在系統中有行為的用戶在數據庫中都有了記錄。行為越頻繁的用戶,其標簽狀態越實時。
為了保證用戶標簽不過時,我們記錄用戶標簽的更新時間。通過逐條掃庫的方式,更新數據庫中更新時間較為久遠的數據,重新計算標簽。
由於用戶最新的行為會導致標簽更新,因此掃庫的方式只是為了保證標簽不會因為時間的推移而過時。這方面的時效性要求在一周,一天以內都可以接受的。
用戶行為的監聽
一種監聽用戶行為的方法是通過異步消息。用戶的行為會在不同的服務器中發生。當服務器檢測到相關的事件時,通過消息系統發出消息通知,從而告知標簽系統。然而采用消息系統實現有以下2個問題:
- 需要其它系統配合發出消息
- 如果消息丟失、消息重復則標簽計算不准確
消息重復的問題可以通過去重來解決,而其它問題則無法解決了。
因此我們想到采用canal,通過監聽數據庫的變化,來得知訂單狀態變更的事件。這樣,不需要其它系統的配合,需要完成事件的可靠監聽。
總結
我們闡述了一種實現實時標簽系統的方法。通過存儲用戶的歷史行為,我們的底層系統具有了以不變應萬變的能力。通過實時計算標簽,用戶標簽的定義就可以隨時修改了。通過將用戶行為放入elasticsearch中,加快了用戶行為查詢的速度。
另一方面,通過實時重新計算用戶標簽,我們保證了用戶標簽根據用戶行為實時調整。而對於標簽的隨時間推移過時問題,我們通過掃庫的方式來逐漸更新。從而做到了用實時更新應對快速變化,用后台任務應對慢速化。
下面是我的補充:
用戶標簽的離線計算體系
我司目前有很多用戶標簽都是都是通過離線數據分析計算出來的,比如:散單高頻用戶(散單:非包月包年套餐,高頻:每月內連續下單超過3次)、余額不足(會員卡內余額小於50)、沉睡用戶(會員卡余額大於200,但近30天內有完成單,近14天未創建訂單)等。這些標簽都是可以通過各個業務表內的數據 進行匯總計算出來的。所以,我們的方案是定期同步相關數據表到Hive數據表中,然后使用Hive SQL對數據進行離線數據分析,然后將數據清洗到現有的用戶標簽相關數據表中。