閱讀493 返回首頁    go 阿裏雲 go 技術社區[雲棲]


創業公司如何做數據分析(五)微信分享追蹤係統

作為係列文章的第五篇,本文重點探討數據采集層中的微信分享追蹤係統。微信分享,早已成為移動互聯網運營的主要方向之一,以Web H5頁麵(下麵稱之為微信海報)為載體,利用微信龐大的好友關係進行傳播,實現宣傳、拉新等營銷目的。以下圖為例,假設有一個海報被分享到了微信中,用戶A與B首先看到了這個海報,瀏覽後又分享給了自己的好友,用戶C看到了A分享的海報,瀏覽後繼續分享給了自己的好友。這便形成了一個簡單的傳播鏈,其中蘊含了兩種數據:
  • 行為,指的是用戶對微信海報的操作,比如打開、分享。
  • 關係,指的是在海報傳播過程中,用戶之間形成的傳播關係,比如用戶A將海報傳播給C。
創業公司如何做數據分析(五)微信分享追蹤係統
這樣的數據的意義在於:第一,統計分析各個渠道的海報的傳播效果;第二,對傳播貢獻較大的用戶發放微信紅包獎勵,提高用戶的分享積極性。微信分享追蹤係統,便是完成對這兩種數據的采集和存儲。在過去的一年裏,受到公司業務和運營推廣方向的影響,
熟悉微信開發的朋友應該知道,第一,每個微信用戶在某個公眾號下都擁有一個唯一的open_id,打開微信海報時,可以通過OAuth2靜默授權在用戶無感知的情況下拿到其open_id;第二,通過微信JS-SDK,我們可以捕捉到用戶對海報頁麵的分享事件;第三,拿到用戶在公眾號下的open_id後,便可以對該用戶發放微信紅包了。基於這三點,我們便可以實現相關的數據追蹤和分享獎勵了,本文主要是總結我們在微信分享追蹤上的方案演進。
首先要說一點的是,其實微信分享追蹤係統本身並不複雜,但是與複雜的產品業務結合到一起,就變得越來越複雜了。如何做到將數據邏輯與產品業務邏輯剝離開,以不變應萬變,就是這裏要說的方案演進了。

1. 早期服務
早期的微信分享追蹤係統,筆者曾經在淺談微信公眾號營銷背後的技術一文中介紹過,其時序圖如下所示。基本流程是:第一,用戶打開海報時,通過OAuth2授權,將open_id加入到頁麵鏈接中;第二,前端上報瀏覽事件,需要帶上open_id和傳播鏈信息;第三,用戶分享時,需要在分享出去的鏈接中加上傳播鏈信息,所謂傳播鏈信息,就是每個分享過的用戶的open_id組合,比如“open_id_1;open_id_2”;第四,上報用戶的分享事件,需要帶上open_id和傳播鏈信息。後端收到上報數據後,根據不同的功能需求,將數據保存到不同的數據表中,用於後期消費。隨著業務的發展,這個係統暴露出一些問題:
隨著推廣活動的調整,統計和獎勵政策也隨之變化,比如有的依據一度分享者的分享次數進行獎勵,有的依據一度、二度分享者帶來的瀏覽量進行獎勵等等,還有需要根據上報的參數不同做不同的處理。所有邏輯都在上報的API請求中處理,來一個需求加一段邏輯,導致該請求的功能不斷膨脹,而且一些推廣活動已經下線了,相關的邏輯也沒有清理掉。
參數比較混亂,頁麵URL中攜帶了不同的參數,包括微信相關參數、產品相關參數,前端上報時需要攜帶不同的參數,而前端頁麵太多,經常搞錯。
創業公司如何做數據分析(五)微信分享追蹤係統
2. neo4j的嚐試
於是,我們思考,有沒有可能在後端直接構建完整的傳播信息,後期使用時直接根據條件就可以查詢出所需的數據,前端上報時也不用攜帶傳播鏈信息,我們想到了圖形數據庫存儲技術。
圖形數據庫是一種非關係型數據庫,它應用圖形理論存儲實體之間的關係信息。在文章開頭的那張傳播圖中,用戶的行為數據其實可以歸結為用戶與海報之間的關係數據,這樣,這個係統其實就包含兩種實體:用戶、海報,三種關係:用戶打開海報、用戶分享海報、用戶之間的傳播。在諸多圖形數據庫中,我們決定選擇比較成熟、文檔相對豐富的neo4j來做DEMO。采用neo4j的查詢語法,很簡單的就可以查詢出所需數據,簡單示例一下。
創業公司如何做數據分析(五)微信分享追蹤係統
下圖呈現基於neo4j存儲的新係統時序圖,在OAuth2授權的重定向過程中,建立User和Poster節點信息,以及二者之間的OPEN關係信息,並且對頁麵URL計算hash值(去除無用參數信息),然後將用戶open_id和URL的hash值加到頁麵URL中返回給前端。用戶分享時,把該用戶的open_id作為parent字段值,加到分享鏈接中,新用戶打開該鏈接時,會根據該值來建立User與User節點之間的SPREAD關係信息。在用戶分享的事件中,做一次數據上報,攜帶open_id和頁麵URL的hash值即可,後端拿到信息後,便可以建立User與Poster之間的FORWARD關係信息。如此,便可以建立完整的微信分享追蹤數據了。
創業公司如何做數據分析(五)微信分享追蹤係統
然而,一切並非預期的那麼完美,在DEMO過程中,我們發現有兩點問題不能很好的滿足我們的需求:
  • 無法根據時間條件快速查詢信息,比如查詢出昨天的一度分享者。
  • 在查詢用戶間的關係時,會發生誤判。比如在下圖所示的傳播關係中,UserA和UserC的傳播關係是發生在海報PosterA上的,在PosterB上並沒有,但是當我們嚐試查詢二度分享者時,會將UserA->UserC->PosterB誤判為二度分享。
創業公司如何做數據分析(五)微信分享追蹤係統
雖然這些問題可以想辦法繞過去,比如根據時間建立不同的實體節點等等,但是這樣會把數據存儲做複雜化,經過權衡,我們暫時擱置了這個方案。

3. 基於用戶行為數據采集係統的方案
在創業公司如何做數據分析(三)用戶行為數據采集係統一文中,曾經提到早期的數據采集服務是分散在各個業務功能中的,後來我們重新構建了統一的用戶行為數據采集係統。在完成這個係統後,我們開始考慮將上述的微信分享追蹤係統並入其中,主要工作有:
數據上報的流程與早期的係統一致,但是更換原有的上報方式,采用用戶行為數據采集係統的方案統一上報微信分享的數據;
數據接入Kafka後,一方麵直接將原始數據存儲到Elasticsearch,另一方麵,以worker的形式來消費數據,根據相應的業務需求提取出所需的數據存入格式化數據表中,用於統計和獎勵活動。當某個推廣活動結束後,將其所屬的worker停掉即可。
創業公司如何做數據分析(五)微信分享追蹤係統
通過這樣的改進,我們暫時解決了前端上報混亂和後端業務邏輯膨脹的問題,將數據上報和業務需求隔離開。數據方麵,實時數據流在Kafka中,曆史數據也在Elasticsearch中有存儲;業務需求方麵,來了一個新的需求後,我們隻需添加一個新的worker來實現消費邏輯,活動結束後停掉worker。

最後更新:2017-04-17 10:30:51

  上一篇:go Python爬蟲係列(一)初期學習爬蟲的拾遺與總結
  下一篇:go 智能預約功能可以提升經營效率和服務品質!