追求卓越
打造極致文化與產品研發結合的最佳實踐
神策已啟動「卓越產品計劃」
產品功能、性能、穩定性不斷邁向新臺階
給客戶帶來價值,價值源于對產品的不斷打磨。對神策分析的性能進行持續優化一直是我們的工作重點,一方面可以顯著提升產品使用體驗,另一方面能夠為客戶降低硬件成本以承載系統運行。
本文將結合具體業務場景,詳細解讀神策分析的五重性能優化。
第一,批量導入性能優化
神策將數據分區分為三層,第一層是 Project_id,代表用戶項目;第二層是 Day_id,代表日期,第三層是 EventBucket(默認為 10 個,可自主配置),代表數據對應事件的分桶。
通常情況下,批量導入會涉及多個項目、多個日期的多個事件,同一個項目、同一天的同一個事件桶數據應該輸出到同一個文件,在保證文件質量的基礎上,導入性能優化核心要解決兩個問題:第一,避免數據傾斜;第二,盡可能提高并行度。針對此,神策從以下四個維度進行了導入性能優化:
● 跟三層分區保持一致,使用三元組(Project_id, Day_id, EventBucket)進行數據 shuffle,以保證一個分區下的數據文件數最少
● 在優化方案中引入遞增的 slice,解決三元組可能引起的數據傾斜問題
● 提出數據分布預估的導入策略,包括后置預估和前置預估
● 設計流水線提交方案,避免前置預估計算帶來的額外開銷
在后續的文章中我們將詳細介紹批量導入性能優化,此處不做贅述。
第二,智能聚合表優化
有別于傳統的數據倉庫建設,神策分析在數據流處理過程中,基本省去了復雜的 ETL 流程和傳統數據倉庫的分層建設思路,用戶可以直接基于事件表 + 用戶表 + Item 表模型進行數據分析,采用通用分析模型的方式,快速計算出自己想要的指標和結果。這種設計大大降低了用戶的理解和使用成本,但對于相同或者相似維度的指標,往往需要基于原始表模型進行重復計算。
智能聚合表優化的基本思路是基于用戶實際查詢,針對高頻指標和維度,智能構建出中間服務層數據模型,在后續查詢時基于中間表的方式進行計算,從而避免所有指標都要基于原始表所帶來的高計算成本。當然,在實際執行智能聚合表優化的過程中,我們也碰到了一系列的技術挑戰。比如,高頻維度和指標的選取需要綜合考慮指標的計算成本、聚合表的壓縮率、聚合表本身的計算成本等因素。
另外,由于高基數維度的存在,聚合表往往達不到很好的壓縮效果,對此我們結合實際業務特點,有針對性地采取熱門維度值截取、時間或者數據類型分桶、BitMap 存儲壓縮等方式,將高基數維度降低為低基數維度,大大提高了聚合表的壓縮效果。
第三,數據重組織查詢優化
查詢執行,是檢驗系統是否健壯的試金石,面對后端存儲的海量數據,只有查詢引擎足夠強大,才能保證前端的實時查詢平穩運行。在我們針對神策分析開發的一系列基于數據組織的性能優化中,shuffle merge 是重要的一項。shuffle merge 充分利用了底層數據的有序性,變全排序為歸并排序,跳過耗時的 sort 算子,極大地降低了排序的時間復雜度,加速了計算進程。
在進行數據重組織查詢優化過程中,針對以下兩個問題我們可以提出針對性優化方案:
● 對于數據量較大的客戶,其分區內文件數量較多,再加上客戶數據或延遲上報,會進一步增加單分區內的文件數量。針對此,我們設計了虛擬分桶采樣組,在數據重組織時,盡量將同一采樣組的數據組織到同一文件中
● 對于慢文件拖慢整體進度、shuffle merge 的歸并在數據規整后沒有有效利用采樣組以提升并行度這兩個難題,我們提出了 merge all 的方案,將歸并從 union 算子下移到 scan 階段,直接桶對桶(采樣組對采樣組)做歸并
關于數據重組織查詢優化的更多細節實踐,將在下一篇文章中詳細展開。
第四,查詢去重優化
查詢去重是針對高并發場景下的查詢優化。在實際業務場景中,我們發現用戶在高峰期發起的大量查詢中,會包含部分相同的指標內容,如果將這種并行查詢全部下發到查詢引擎中容易導致查詢資源整體緊張。因此,我們引入了針對查詢的全局去重機制,對并發場景下的重復查詢進行排隊管理。針對每一個查詢類型,生成一個查詢條件簽名作為全局鎖,相同的查詢條件要先獲得全局鎖,然后才能真正執行查詢。當相同的全局鎖已經被同一個查詢條件占用時,后續的查詢會等待鎖的釋放,當第一個查詢執行成功之后會將查詢結果寫入到緩存系統,后續即使獲得了全局鎖的查詢也可以直接從緩存系統中獲取到查詢結果,從而避免了大量重復查詢在同一時間段的擁擠。
查詢去重優化能夠有效緩解和優化高峰場景下的并發查詢,也在一定程度上提高了系統整體的健壯性。
第五,頁面首次首屏加載時間優化
優化頁面加載速度、持續提升用戶體驗是我們對產品性能的另一種優化。
首先,通過線上數據分析和線下性能診斷,定位性能瓶頸并制定可行的解決方案,沉淀出通用的性能分析平臺,便于我們通過數據對頁面性能進行多維度診斷。通過線上線下對頁面性能的分析,我們針對性能分析階段發現的問題,如資源體積大導致加載過慢、資源請求過多導致加載阻塞、資源和請求的時序問題導致首屏渲染的較慢等,采取了多種優化手段,包括:
● 同步渲染機制,在 HTML 初始化的時候,同步返回首屏所需的異步數據,避免發送多次異步請求
● 非首屏的模塊異步加載
● 調整靜態資源和異步請求的請求時序,減少阻塞
● 減少非必要的異步請求
● 建議有條件的客戶開啟 GZIP 壓縮和 HTTP2 協議等
通過多輪性能優化,客戶頁面首屏時間平均下降 30%,用戶體驗得到了很大提升。
以上性能優化實踐已經在部分客戶環境中得到了效果驗證。下圖是某客戶環境上線相關優化后的概覽平均查詢時間,已經從高峰期的 24s 逐步降低至目前的 12s 左右。
圖 模擬數據
雖然性能優化已經取得了階段性的成果,但是「卓越產品計劃」仍在繼續,我們也將會在以下幾個重點方向持續投入:在“應用化”重構和容器化方向,繼續完善分離集群部署的架構,完善 SaaS 化多租戶能力、完善多種部署模式下的架構統一;在智能聚合表方向,提供更加標準化的聚合表產品能力,更加智能聚合表構建方式、基于物化視圖的數據一致性中間表和中間表動態管理能力等。此外,我們還會在產品能力上加強對于業務資源治理能力的支持,提供統一的資源管理中臺和集中式的業務集市中間表管理能力。
關注神策數據公眾號,了解更多產品技術解讀。