一、離線統計方案概述
離線統計在App使用過程中,不斷采集統計數據,寫入內存緩存或本地文件,并通過相應的策略控制,在合適的時機統一上報,由于這種方式將多條統計數據合并成一個上報請求,而且上報前會做Gzip壓縮,因此對性能和流量幾乎沒有影響,但由于它不是立即上報,取決于多種策略和時機控制,因此在實時性方面表現略差,但是可以通過多種策略來盡量保證其實時性,另外,由于離線日志會先通過內存緩存的方式收集,因此在App遇到異常中止時,會出現日志丟失的情況。
二、離線統計方案工作流程
圖2-1 離線統計工作流程
- 統計埋點產生一條日志
- 將該日志加入內存緩存中,并檢查當前緩存條數是否>20
- 如果緩存條數>20,則將全部緩存一次性寫入日志臨時文件WMStat.dat,然后檢查日志文件大小是否>10KB
- 如果日志文件>10KB,將該文件拷貝至上報緩沖區,然后做Gzip壓縮
- 遍歷緩沖區內未上報成功的文件,檢查每個文件的上報次數
- 如果文件上報次數已超過3次,則直接刪除該文件(該文件內日志將會丟失),否則發起網絡請求進行上報
- 如果上報成功,則從緩沖區內刪除該文件,否則將上報次數+1,等待下次上報
上述這個主流程,發生在App的使用過程中,會隨著統計的產生,不斷的觸發,但由于App本身使用過程中可能出現的不穩定性、以及日志文件達到上報閾值的時間點不確定性,因此為了讓日志回收的更及時徹底一些,我們在一些App常見時機觸發了特殊的上報策略,分別是:
- App每次啟動時,會檢查上報緩沖區內是否存在待上報文件,若存在,立即上報
- App從前臺進入后臺時,會將內存緩存內的日志文件立即寫入本地文件(不檢查條數是否>20條),并將日志文件迅速壓縮上報(不檢查大小是否>10KB),保證日志文件盡可能被回收,避免丟失過多
三、離線統計請求示例
圖3-1 離線統計請求示例