現在幾乎所有的電商平臺都或多或少的上了推薦系統,常用的推薦系統有。熱門推薦、最近瀏覽、猜你喜歡、看了還看、買了還買、綁定銷售,等等,這麼多NB的系統都依賴一點,就是用戶行爲數據,這些用戶行爲數據都從那來的呢,那就是埋點系統了,埋點系統是一切推薦系統的生命源。
所謂埋點系統,按本人理解就是埋點引擎+存儲系統,埋點引擎位於前端系統與後端存儲系統之間,主要是接收前端的埋點數據,經協議轉換以後存儲到後端存儲系統。
整個系統的架構如下所示:
1,用戶行爲搜索存儲格式選擇
數據存儲格式一定要考慮到足夠的可伸縮性,因爲業務方的需要總是千奇百怪,一個NB的存儲設計可以減少後續很多工作量,下面是我設計埋點系統存儲的數據項,歡迎討論。
Name |
Des&R |
msg_id |
消息ID |
realuserid |
用戶ID,登錄後存在, |
sysname |
來源系統的名稱 |
servicetype |
具休來源頁面 |
oper_type |
行爲類型 |
appid |
移動應用會有APPID |
location |
移動應用會有APPID位置信息 |
accesstime |
訪問時間 |
ip |
PC端IP地址 |
itemid |
商品ID |
anomoususerid |
用戶ID,沒有登錄存匿名,登錄以後存實際用戶ID |
descinfo |
描述信息,日誌類型是評分時,此處寫評分 |
sessioninfo |
會話IDs,隨機生成的10位數字,每位單獨生成 |
2,存儲系統選擇
當時選擇HBASE主要是考慮到兩點因素,一是它的可伸縮性,一是它較高的實時性,當然也有很多其它的選擇,比如mongodb 也不行,只是我沒有用過,不熟。
3,埋點引擎
埋點引擎是本系統的核心所在,主要負責解析前端發來的http消息,解析以後通過thrift協議丟給thriftserver,thriftserver再放到HBASE。
這個設計上來講還是比較簡單,主要是要考慮到高併發,短連接的情況,下面是單機的一個設計。
採用了比較典型的多線程設計模型。
Monitor是主線程,負責接收前端的埋點消息,通過某種調度算法放到對應的隊列,給客戶端應答埋點成功消息。
Scheduler:調度模塊,Monitor調用,不是單獨線程。
QX:消息隊列,採用無鎖隊列設計,可以理解爲一個先進先出的緩存機制,Monitor負責生產消息,Worker負責消費消息。
Worker:負責消息的校驗,合法性檢查,解析,打包,發送任務。