上圖是 2012 年**核心業務應用關係的拓撲圖,還不包含了其他的非核心業務應用,所謂的核心業務就是和交易相關的,和錢相關的業務。這張圖大家可能看不清楚,看不清楚才是正常的,因為當時的阿里應用數量之多、應用間關係之混亂靠人工確實已經無法理清楚了。
基於微服務體系之下構建的業務系統存在的問題基本上分為四類:
第乙個是故障定位難,今天我們**下單的動作,使用者在頁面上點購買按鈕,這麼乙個簡單操作,其實它背後是由十幾個甚至數十個的微服務去共同完成的,這十幾個甚至幾十個微服務也由不同的團隊去負責,這是微服務的過度協同帶來的結果,一旦出現問題,最壞情況下我們也許就要拉上十幾個團隊一起來看問題。
第二個問題是容量預估難,阿里每年要做若干次大促活動,在以前的巨石系統當中做容量預估是非常容易的,因為我們大促時候按照預估的流量與當前系統的單機壓測容量做乙個對比,把所有的系統按比例去擴容就可以了。而實際上在大促的場景下,每乙個系統在核心鏈路當中的參與度、重要性都是不一樣的,我們並不能對每乙個系統做等比例的擴容,所以微服務架構下的容量預估也是一件難事。
第三個問題就是資源浪費多,資源浪費多首先是容量預估不准的乙個後果,同時資源浪費多背後隱含的另乙個問題就是效能優化難,為什麼這麼說呢?我們當開啟乙個頁面發現它慢的時候,我根本不知道這個頁面慢在**,瓶頸在**,怎麼去優化,這些問題累積下來,資源的浪費也成為了乙個巨大的問題。
第四個是鏈路梳理難,我們乙個新人加入阿里的時候,老闆讓他負責乙個系統,他在這個複雜的微服務體系中,就像人第一次在沒有地圖沒有導航的情況下來到乙個大城市一樣,根本不知道自己身在何處。應用負責人不知道自己的系統被誰依賴了,也不知道自己的系統下游會影響其他哪些人。
在阿里巴巴每天有超過一萬億次的分布式呼叫,這個資料其實也是很早之前統計的,如果在這一萬億次呼叫當**現了乙個問題,我們怎麼去定位?看一下這個例子,系統 a 呼叫 b,b 呼叫 c,在這之後 a 又呼叫了 d,如果 b 調 c 出了問題的話,那麼負責維護 a 系統的開發人員根本不知道問題到底出在**,他只知道這次呼叫失敗了,那麼我們怎麼樣解決這個問題?雖然現在的很多大公司都在重複造很多輪子,但還好在阿里巴巴中介軟體這個東西沒有被重複造出兩個,基礎設施還是相對比較統一的。所以我們可以在一套中介軟體裡做統一埋點,在分布式呼叫框架、分布式訊息系統、快取系統、統一接入層、web 框架層的傳送與接收請求的地方做統一埋點,埋點的資料能夠被一套中介軟體在系統之間進行無縫透傳。
當使用者的請求進來的時候,我們在第乙個接收到這個請求的伺服器的中介軟體會生成唯一的 traceid,這個 traceid 會隨著每一次分布式呼叫透傳到下游的系統當中,所有透傳的事件會儲存在 rpc log 檔案當中,隨後我們會有乙個中心化的處理集群把所有機器上的日誌增量地收集到集群當中進行處理,處理的邏輯比較簡單,就是做了簡單清洗後再倒排索引。只要系統中報錯,然後把 traceid 作為異常日誌當中的關鍵字打出來,我們可以看到這次呼叫在系統裡面經歷了這些事情,我們通過 traceid 其實可以很容易地看到這次呼叫是卡在 b 到 c 的資料庫呼叫,它超時了,通過這樣的方式我們可以很容易追溯到這次分布式呼叫鏈路中問題到底出在**。其實通過 traceid 我們只能夠得到上面這張按時間排列的呼叫事件序列,我們希望得到的是有巢狀關係的呼叫堆疊。
要想還原呼叫堆疊,我們還需要另外乙個東西叫做 rpcid(在 opentracing 中有類似的概念,叫做 spanid),rpcid 是乙個多維序列。它經過第一次鏈路的時候初始值是 0,它每進行一次深入呼叫的時候就變成 0.1,然後再公升就是 0.1.1,它每進行一次同深度的呼叫,就是說 a 調完 b 以後又調了 d 就會變成 0.2,rpcid 也隨著本次呼叫被列印至同乙份 rpc log 中,連同呼叫事件本身和 traceid 一起被採集到中心處理集群中一起處理。
收集完了以後,我們對所有呼叫事件按照 rpcid 進行乙個深度遍歷,我們就可以獲得這樣的乙個呼叫堆疊,上圖中的呼叫堆疊實際上就是真實的**交易系統裡面進行下單的交易呼叫堆疊,可以看到這次呼叫經歷了很多系統。但大家在鷹眼的視角上面來看,就好像是在本地發生的一樣,我們可以很容易地去看到如果一次呼叫出現了問題,那問題的現象是出現在**,最後問題的根因又是發生在了**。除了呼叫異常的返回碼之外,我們在右邊其實還可以看到每次呼叫的耗時是多少,我們也可以看到每一次呼叫如果慢了它是慢在**。我們從這張圖中解釋了鷹眼是如何解決微服務四大問題中的故障定位難的問題,它可以通過倒排索引,讓使用者反查出每一次呼叫的全貌是怎樣的。
如果我們對萬億級別的呼叫鏈資料進行聚合,是否能夠獲得更有價值的資訊?我們可以看一下,每一次呼叫除了它唯一標識 traceid 和 rpcid 之外,還包含了一些標籤資訊 (tag),什麼是標籤呢?就是具備共性的, 大家都會有的這麼一些資訊,比如說這次呼叫它分別經歷了這些系統,這些系統它每次呼叫的 ip 是什麼,經過哪個機房,服務名是什麼?有一些標籤是可以通過鏈路透傳下去的,比如入口 url,它透傳下去以後我就知道這次請求在下去之後發生的每一次事件都是由通過這個入口去發起的,那麼如果把這些標籤進行聚合計算,我們可以得到呼叫鏈統計的資料,例如按某機房標籤統計呼叫鏈,我們就可以得到每個機房的呼叫次數的趨勢圖。
鷹眼:
阿里巴巴AI Pandas
1.series 主要用於處理一維資料,一般由乙個陣列的資料構成。2.dataframe 主要用於處理二維資料。from pandas import series,dataframe series eg import pandas as pd s1 pd.series 1,2,3,4 s1 0 1 ...
「妖精」團隊 阿里巴巴
6年 這個正迅速擴張的團隊仍超乎尋常地保持著 亢奮 和 戰鬥欲 有人質疑這是 精神控制術 而阿里巴巴決定在新年將塑造團隊的種種魔力 制度化 成為其 基本法 在以 白娘子傳奇 聞名的江南杭城,坐落著兩個氣質與這座城市極不搭調的樓層。15天前,這個富有 攻擊性 的空間 迫使全球最有影響力的女人之一,eb...
「妖精」團隊 阿里巴巴
6年 這個正迅速擴張的團隊仍超乎尋常地保持著 亢奮 和 戰鬥欲 有人質疑這是 精神控制術 而阿里巴巴決定在新年將塑造團隊的種種魔力 制度化 成為其 基本法 在以 白娘子傳奇 聞名的江南杭城,坐落著兩個氣質與這座城市極不搭調的樓層。15天前,這個富有 攻擊性 的空間 迫使全球最有影響力的女人之一,eb...