一種基於實時分位數計算的系統及方法

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"導讀:","attrs":{}},{"type":"text","text":"性能分析等場景對實時分位數有強烈訴求。在計算累計時長時,可以將不同時間段的時長簡單相加,而分位數卻無法先計算不同維度下的分位值,然後對其直接聚合,該特性對實時計算帶來了較大挑戰。我們基於TDigest數據結構,利用Redis和Doris等高性能存儲,預先計算所有可能查詢的分位值指標,既可以快速計算指標,同時可以保障查詢效率。該系統已經對百度內內核性能、網絡性能等業務場景進行輸出,並能有效滿足業務高時效的分析需求。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":"全文3663字,預計閱讀時間10分鐘。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"一、問題描述與技術挑戰","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在實際工作中,我們發現許多業務場景中都有對某一數值型指標實時統計分位數的需求,一般要求計算結果有很高準確率同時具備極低的計算延遲,實現這類需求給數據RD的開發工作帶來一定的挑戰,其中主要的技術挑戰包括以下三個方面:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"無法對全量數據進行排序","attrs":{}},{"type":"text","text":":由於在實時計算場景中是逐條處理數據的,無法對全量數據排序,進而無法獲得全量數據的分位數","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"計算邏輯複雜,計算延遲高","attrs":{}},{"type":"text","text":":即時在能夠排序的場景中,高複雜度的排序操作也會帶來很高的計算延遲,無法滿足實時計算的低延遲要求","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"分位數結果無法聚合","attrs":{}},{"type":"text","text":":兩個計算得出的分位數結果無法像求和結果那樣直接累加合併得到新的結果,這爲分位數計算結果的存儲方式帶來挑戰","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"針對上述問題,我們基於TDigest數據結構,實現了實時計算環境下的分位數計算方法,封裝爲基礎組件並向上提供API接口,可以在不同的業務場景(內核性能、搜索性能、PUSH等)下提供實時、準確的分位數計算。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"二、基礎架構與解決方案","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本節我們將從計算分位數的常用數據結構、我們實現分位數計算的基礎架構、解決方案三部分介紹流式計算場景下的分位數計算方法:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":"br"}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2.1 分位數的常用數據結構","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"TDigest計算分位數","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"TDigest是一個簡單,快速,精確度高,可並行化的近似百分位算法,被Spark, ES, Kylin等系統使用。TDigest的核心思想是通過聚類的方法將離散的數據點聚集爲多個不同的質心,在通過線性插值法計算分位數,線性插值法是最簡單的插值算法。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通俗的講:傳統方法是對離散的數據進行排序,在排序結果中直接獲得分位數。而TDigest是將離散的數據聚類爲多個質心,然後對質心進行近似的“排序”,最後通過插值法求取分位數。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/33/331115db1d62add1d109d527398dd157.webp","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,將離散的數據點(圖中無色的數據點)聚類爲多個不同的質心(圖中彩色的數據點),其中每個質心周圍的數據點數決定了該質心所佔的權重(圖中質心的大小),最後通過對所有的質心進行排序,就可以使用線性插值法求取對應的分位數,其中數據點與質心的距離和權重關係如下圖所示。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/fd/fd0da1217041698cf35762824b4a9a0c.webp","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"特別地,在每個TDigest創建時有一個重要的compression參數,主要用於在計算的精確度與空間複雜度之間做權衡:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當compression參數設置越大時,聚類得到的質心越多,則差分法求取的分位數精確度越高;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當compression參數設置越大時,TDigest數據結構佔用的存儲空間越大,則分位數計算的空間複雜度越高","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"設置合適的compression參數,能夠在提高計算準確率的同時,儘可能降低存儲空間,從而滿足業務的實際需求;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了幫助大家在做分位數計算時能夠選取合適的參數,我們選擇百萬級的數據量(即統計100w個隨機變量的分位數),在不同參數下的計算精確度和空間複雜的如下表所示:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/46/46c549cc3b0db85f68e7b9ae84349783.webp","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"針對上表所示的數據,我們將做出以下三點說明:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本次測試使用MergingDigest數據結構,該結構佔用的空間與compression參數的取值有關,與統計的數據量無關;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨着數據量的增大,compression的取值應適當增大,能夠有效提高計算的準確率","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2.2 分位數組建的基礎架構","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於實時分位數計算是一個常見統計方法,在許多業務場景都會提出類似的需求,對需求方關注的統計指標計算不同的分位數。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲節約人力成本,縮短迭代開發的時間週期,我們基於TDigest數據結構,封裝了通用的基礎組件,從而在不同的業務場景下快速實現實時分位數統計的開發。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/94/94198e770d5bc183d9a693aaa0ef5ab9.webp","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,在實時分位數計算的通用組件中,其基礎架構和執行過程主要分爲以下幾個關鍵步驟:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1) 從上游業務方讀取需要統計分位數的原始數據;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2) 根據業務方需求的分組規則,按分組聚合爲TDigest數據結構,將聚合結果存入Redis中,或與Redis中已存在對應的數據進行合併,以獲取準確的計算結果;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3) 從TDigest結構中獲取分位數的計算結果,並向上返回;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"綜上所述,我們通過封裝基礎組件並向上提供API的方式,實現了通用、靈活且對應用方透明的分位數計算方法,能夠保證實時性的同時,實現高準確率、低空間複雜度的分位數計算,目前已經在性能平臺、搜索、PUSH等廠內多個業務需求中落地應用","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2.3 整體實現方案","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"基於上述介紹的實時分位數基礎組件,在廠內的大多數業務場景中,通常從消息隊列中獲取應用方上報的原始數據,經過一系列解析和計算後,將計算結果存儲Doris等OLAP引擎或DB中,共需求方查詢和生成對應報表,這是一個通用的解決方案。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據上述分析,我們就可以得到一個分位數實時計算作業的基本架構,其架構模型如下圖所示:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/88/88e7875730c135aa068fefa0d55739a7.webp","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,在廠內的環境中,實時分位數計算任務的常用基本架構主要包括以下幾個關鍵步驟:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)從消息隊列中讀取業務方上報的基礎數據,並按業務邏輯進行數據解析;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)通過FlatMap方法,按不同字段將一條數據展開爲多條(具體內容將在第3節詳細介紹);","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3)根據業務設計的查詢維度,按不同的key對數據進行分組操作;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4)分別將每個key的數據合併爲一個TDigest數據結構;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"5)將聚合後的數據與Redis中存儲的數據進行合併,同時將合併結果寫回Redis中;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"6)最後根據數據聚合結構,從每個分組對應的TDigest結構中獲取對應的分位數;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"綜過以上步驟,可以實現高實時性、高精確度和低空間複雜度的實時分位數計算方法,能夠滿足大多數實時分位數業務的需求,在更多的業務場景中可能需要根據實際需求進行適當的調整。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"三、解決分位數無法聚合的問題","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":"br"}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"3.1 問題描述","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在實際的業務需求中,我們可能需要按照不同的時間、查詢維度等信息檢索統計的分位數。但是,已經計算好的兩個分位數結果是無法進行聚合操作的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如:針對手百APP的用戶訪問時長,我們可以將某一天中每個小時訪問時長的和(SUM)進行累加,從而獲得這一天的訪問時長總和。但我們如果記錄了每個小時中訪問時長的80分位數,則無法對這些分位數進行聚合,即無法求得這一天中訪問時長的80分位數。這種現象被稱爲分位數的“不可聚合性”。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因此,在實際應用中,如果業務需求要對不同時間、不同維度下的指標分位數進行任意聚合、查詢等操作,就爲分位數的計算和存儲提出新的技術挑戰。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"3.2 分位數聚合方案","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"針對上述問題,我們提出按所有查詢維度進行提前聚合計算的解決方案,即針對每一種可能出現的查詢維度組合,我們都提前計算分位數並存儲,這樣在查詢過程中直接檢索對應查詢維度的聚合計算結果,在解決了分位數的“不可聚合性”問題的同時,也避免了重複的聚合計算帶來的時間開銷,縮短了查詢耗時,提升了用戶體驗。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來,我們通過一個簡單實例講解具體的聚合計算方法:假設在某業務場景中,用戶關注的查詢維度共有三個字段,分別爲:APP版本(app_version)、廠商(manufacturer)和客戶端操作系統版本(os_version)。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"則對於任意維度組合的查詢操作,用戶有可能採用 2^3=8 種聚合查詢方式。因此,我們通過排列組合的方式,枚舉中所有可能的聚合查詢方式,分別統計分位數。假設從上游讀取到的部分數據如下表所示:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/97/97c3ba5b99a1e013693c7fd8d61fd2fe.webp","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"並且,如果對某一字段進行聚合查詢,我們將該字段的取值記爲關鍵詞 “ALL”,則這條數據共對應2^3=8 種可能的聚合查詢方式。爲了模擬出8種不同的維度排列組合方式,我們利用二進制排列組合的方式,讓每個字段嚴格對應二進制數據中的一位:如果該位的取值爲0,則字段內容爲上報的原始值(即上表中的實際取值);若該位的取值爲1,則對應字段的取值記爲關鍵詞“ALL”。此外,二進制數據中從右至左每一位與字段的對應關係爲:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第1位對應os_version","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第2位對應manufacturer","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第3位對應app_version","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由此可得,任意字段聚合查詢的排列如何方式如下表所示:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/de/deacf4cdfdb93695464968c67965181c.webp","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這樣,我們就通過二進制排列組合的方式,枚舉出所有可能的維度組合查詢方式。在實際的計算過程中,可以利用流式計算的FlatMap算子,按照上述的排列組合方式,將一條數據擴展爲多條數據,並進行分組聚合、計算分位數,將最終的計算結果存入Doris等存儲引擎中供用戶查詢。此時,計算結果中實際已經包含了所有可能的聚合查詢方式,業務方可以按需要直接查詢到最終的分位數結果,而無需另外進行聚合計算操作,在有效提高查詢效率的同時保證了用戶體驗。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":"br"}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"四、結語","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":"br"}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以上內容是我們從宏觀的角度,對實時分位數計算方法的核心技術、基礎架構和技術難點進行了簡要介紹。如有任何問題或建議,歡迎大家隨時溝通交流。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":"br"}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本期作者 | 子陽,負責百度性能平臺的實時數據開發工作,主要研究方向爲流式計算、智能預測等","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"招聘信息","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"百度APP技術平臺研發部負責百度APP和百家號技術平臺建設,也承載着PUSH、消息、互動、交易、日誌、性能、審覈、B端等一系列標杆中臺的建設,歡迎大家加盟,期待着你的到來! ","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"無論你是後端,前端,還是大數據,這裏有若干職位在等你,歡迎投遞簡歷,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"【聯繫方式同名公衆號百度Geek說,輸入內推即可】,","attrs":{}},{"type":"text","text":"百度APP技術平臺研發部期待你的加入!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"閱讀原文","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"|","attrs":{}},{"type":"link","attrs":{"href":"https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg5MjU0NTI5OQ%3D%3D%26mid%3D2247493116%26idx%3D1%26sn%3D90925b509f4d8bfedc7066f2317e3d9c%26chksm%3Dc03ed580f7495c9621068194b799dd7fcc9ebff535a6fa04aacf593eae549c8d500b06df57d1%26token%3D1585026907%26lang%3Dzh_CN%23rd","title":null,"type":null},"content":[{"type":"text","text":"一種基於實時分位數計算的系統及方法","attrs":{}}],"marks":[{"type":"strong"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"推薦閱讀","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"|","attrs":{}},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=Mzg5MjU0NTI5OQ==&mid=2247493076&idx=1&sn=8c23de92314e4a3c299d4d54f0cb0030&chksm=c03ed5a8f7495cbe3d23bcc5c78ec5076366fec66ebcebd864ac11155621c438ce071dfa38e9&scene=21#wechat_redirect","title":null,"type":null},"content":[{"type":"text","text":"商業落地頁端到端性能優化實踐","attrs":{}}],"marks":[{"type":"strong"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"|","attrs":{}},{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=Mzg5MjU0NTI5OQ==&mid=2247491923&idx=1&sn=ca0cba965f235306d27fe8bfd227076c&chksm=c03ed12ff74958397038f8524bffacb6c0d6d2d344e17e55e7a1343e0c54792ad3e2ae2d7182&scene=21#wechat_redirect","title":null,"type":null},"content":[{"type":"text","text":"詳解支撐7億用戶搜索的百度圖片處理收錄中臺","attrs":{}}],"marks":[{"type":"strong"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"---------- END ----------","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"百度Geek說","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"百度官方技術公衆號上線啦!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"技術乾貨 · 行業資訊 · 線上沙龍 · 行業大會","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"招聘信息 · 內推信息 · 技術書籍 · 百度周邊","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"歡迎各位同學關注","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章