1. 程式人生 > >微博平臺的鏈路追蹤及服務質量保障系統——Watchman系統

微博平臺的鏈路追蹤及服務質量保障系統——Watchman系統

如其他大中型網際網路應用一樣,微博平臺由眾多的分散式元件構成,使用者通過瀏覽器或移動客戶端的每一個HTTP請求到達應用伺服器後,會經過很多個業務系統或系統元件,並留下足跡(footprint)。但是這些分散的資料對於問題排查,或是流程優化都幫助有限。對於這樣一種典型的跨程序/跨執行緒的場景,彙總收集並分析這類日誌就顯得尤為重要。另一方面,收集每一處足跡(footprint)的效能資料,並根據策略對各子系統做流控或降級也是確保微博平臺高可用的重要因素。要能做到追蹤每個請求的完整呼叫鏈路;收集呼叫鏈路上每個服務的效能資料;通過計算效能資料和比對效能指標(SLA)再回饋到控制流程(control flow)中,基於這些目標就誕生了微博的Watchman系統。在業界,Twitter的Zipkin和淘寶的鷹眼系統也是類似的系統。

這樣的系統通常有幾個設計目標:

  1. 低侵入性(non-invasivenss):作為非業務元件,應當儘可能少侵入或者不侵入其他業務系統,保持對使用方的透明性,可以大大減少開發人員的負擔和接入門檻。
  2. 靈活的應用策略(application-policy):可以決定所收集資料的範圍和粒度。
  3. 時效性(time-efficient):從資料的收集和產生,到資料計算/處理,再到展現或反饋控制,都要求儘可能得快速。
  4. 決策支援(decision-support):這些資料資料是否能在決策支援層面發揮作用,特別是從DevOps的角度。

Watchman系統架構圖

對於這些設計目標,Watchman系統是怎麼樣做的呢?

  • 既然要追蹤呼叫鏈路要收集資料,通常的做法就是通過程式碼埋點來記錄日誌。這樣一方面要求在所有需要收集資料的地方侵入程式碼進行修改,並且(可能)引入新的依賴。比如淘寶的鷹眼系統在跨程序的遠端呼叫兩側(stub和skeleton)通過埋點記錄資料並傳遞請求上下文(request-context)。

    watchman-runtime元件利用位元組碼增強的方式在載入期織入增強邏輯(load-time weaving),為了跨程序/執行緒傳遞請求上下文,對於跨執行緒watchman-enhance元件通過javaagent的方式在應用啟動並載入class時修改了JDK自身的幾種執行緒池(ThreadPool或幾類Executor)實現,在客戶程式碼提交(execute或submit)時對傳入的runnable/callable物件包上具有追蹤能力的實現(proxy-pattern),並且從父執行緒上去繼承或初始化請求上下文(request-context);如下圖所示:

    而對於跨程序的RPC場景,則動態增強傳輸層的客戶端和服務端的邏輯。微博平臺使用的Motan RPC框架有著類似filter-chain的流程,watchman-aspect會插入自己的filter實現;實現的邏輯就是在RPC請求前獲取請求方的請求上下文,序列化後裝配近請求體中,服務方獲取請求後,再從請求體中反序列化請求上下文,同時設定到執行緒上下文中(ThreadLocal)。如下圖所示:

    這類增強或修改都在執行期完成,對於開發人員完全透明,對於運維人員也很友好;

    普通Java呼叫的處理方式(埋點/追蹤)則是通過AspectJ的靜態織入,相信廣大讀者對AspectJ都不陌生,它提供非常強大的AOP的能力,我們使用AspectJ來定義幾類切面,分別針對WeiboAuth、HTTP介面、資源客戶端的下行方法等。再利用AspectJ的語法定義各個切點,形如:

    @AfterReturning(value="execution(public $type $signature($param))",returning="$return"
    

    之後在目標專案的maven構建過程中依靠ajc進行編譯期的織入。之所以選擇編譯期織入方式是因為我們的業務場景是十分performance-sensitive的。每一個生效的切點也會在執行時向configserver註冊SLA資料。(這個後面會講到)

  • watchman-core元件內建幾類策略,分別用來控制收集資料的範圍、收集資料的取樣率、以及幾種控制策略。

    每個請求進入Watchman系統的邊界後(在這裡是微博平臺Auth系統),通過這些策略來決定哪些足跡需要記錄,比如REST API、RPC呼叫、儲存/快取的操作等;同時也通過策略決定本次請求是否需要取樣,取樣率可以動態修改;之後建立請求上下文並向後傳遞。在每一個控制點,又會根據控制策略來確定對本次請求是否丟棄,或是對整個方法以什麼樣的方式來gracefully degrade等;

    我們先來看下請求上下問(request-context)的簡單定義:

    RequestContext類關聯一個閥門策略介面(ThrottleStrategy)和取樣策略介面(SampleStrategy),每個req-ctx例項被構造時會傳入兩個策略的具體實現。在記錄(trace())時,會根據當前取樣策略來決定是否採集資料,並且策略可以動態更新,包括本地配置檔案的方式,或者同步configserver的方式。從完全關閉、百萬分之一到全量採集幾個粒度可以選擇。

    閥門策略,顧名思義,就像一個閥門,用來控制流量的大小,或是開啟/關閉。預設是全開的,因為認為業務99.999%是可用的,同時源源不斷的效能資料會被收集,在watchman-stream進行彙總計算後會產生與註冊在configserver中的SLA資料的比對結果。比如A服務的效能統計結果低於SLA水平,那麼就會通知到閥門策略,並通過隨機丟棄請求的方式來做流控,當效能結果嚴重低於SLA時就關閉,達到降級的效果。

    網際網路運維中對降級還有一個指標是,是否能優雅的降級,也就是不損害使用者體驗的情況下進行降級。這一點watchman-aspect會根據程式碼上的註解(annotation)來實現,@Degradable可以標註在方法上,可以指定returnType(required)和returnValue(optional),降級時根據returnType來生成偽造的結果並返回,如果使用方有指定returnValue就直接用後者返回,如果預設提供的returnType不滿足需要也可以進行擴充套件。

  • watchman-aspect元件通過非同步日誌(async-logger)會在各個節點上輸出日誌檔案,如何將這些分散的日誌源源不斷的收集彙總並計算?

    通過watchman-prism元件(基於Scribe),將日誌推送到watchman-stream元件(基於Storm),利用這兩個業界成熟的系統以流式的方式處理資料,stream中bolt會根據需求進行聚合、統計等計算(針對性能資料),規範化、排序(針對呼叫鏈資料),之後寫入HBase中。這個過程通過benchmark反映出的結果來看,完全能達到準實時的要求(30s左右)。 對於日誌資料推送:首先應用要以一致的方式輸出日誌,理所當然就是通過Log框架的logger來輸出,每個節點產生日誌後需要再依賴scribe推送到日誌中心,所以我們實現了自己的AsyncScribeAppender,如下:

    由於Scribe是基於Thrift進行通訊,所以我們的Appender擴充套件於Log4j的AppenderSkeleton,以普通Logger的API形式供上層使用(非同步),同時再作為一個ThriftClient直接將資料寫到節點上的ScribeClient,之後再通過網路把日誌推到遠端。watchman-prism在這裡作為遠端接受方,它是擴充套件於Scribe的一個ThriftServer。 而Storm這一側,眾所周知,spout元件作為資料的入口,分發到各個bolt進行流式計算,spout是拉(pull)的模式,它從watchman-prism中不斷取資料,經過簡單的過濾後發射(emit)到其他bolt,不同的bolt有著不同的計算任務,之後將不同緯度的計算資料寫入HBase中。

  • 服務質量保障是Watchman系統的另一特點,在面向服務的架構(SOA)中,各個服務的提供方需要給出SLA(service level agreement)資料,量化服務的各種指標(如吞吐、承載)和服務質量(如99.99% <50ms)。這裡的服務包括http形式的REST API,RPC服務,DB或Cache的介面,以及網路IO層面等; 微博平臺的各業務方的每一層服務都會在Vintage(微博的類Zookeeper系統)中註冊自己的SLA資料,執行時watchman-stream將不斷計算得出的效能資料與通過watchman-registry獲得的各服務的SLA資料進行比對。結果會反映到Dashboard上,這裡與運維的告警系統等整合,可以及時將狀況推送出去,除此之外也會更新registry中的指標,ConfigService根據指標的變化判斷是否通知各個註冊的客戶方,也就是watchman-aspect,閥門策略就會根據通知調整閾值進行干預。流程如下:

    比如某個服務由於瞬時訪問高峰,造成底層資源壓力變大從而服務響應時間變長,控制策略可以根據設定隨機丟棄後續的請求,如果情況加劇就會自動降級該服務,保證核心服務路徑。整個過程可以自動完成也可以人工通過Dashboard控制。

Watchman系統的下一步

之後的迭代會進一步增強watchman-stream的計算/分析能力,爭取在更多的維度上挖掘出有價值的資料;同時依靠watchman-prism來彙總更豐富的業務日誌,力圖在一個請求鏈路上展現更豐富的上下文相關資料。

總之,為構建更健壯、更可靠的微博平臺,Watchman系統會繼續演進。

相關推薦

平臺追蹤服務質量保障系統——Watchman系統

如其他大中型網際網路應用一樣,微博平臺由眾多的分散式元件構成,使用者通過瀏覽器或移動客戶端的每一個HTTP請求到達應用伺服器後,會經過很多個業務系統或系統元件,並留下足跡(footprint)。但是這些分散的資料對於問題排查,或是流程優化都幫助有限。對於這樣一種典型的跨程

springcloud追蹤zipkin服務端搭建

springcloud版本Finchley之後,關於zipkin服務端官方不推薦自行定製編譯。 官方jar包部署 1.下載官方jar包連結:       1.1  手動jar包下載: zipkin-server-2.11.8-exec

SpringCloud服務雲架構構建B2B2C電子商務平臺之-(九)服務追蹤(Spring Cloud Sleuth)

這篇文章主要講述服務追蹤元件zipkin,Spring Cloud Sleuth集成了zipkin元件。 一、簡介Add sleuth to the classpath of a Spring Boot application (see below for Maven and Gradle examples

Spring Boot + Spring Cloud 構建服務系統(八):分散式追蹤(Sleuth、Zipkin)

技術背景 在微服務架構中,隨著業務發展,系統拆分導致系統呼叫鏈路愈發複雜,一個看似簡單的前端請求可能最終需要呼叫很多次後端服務才能完成,那麼當整個請求出現問題時,我們很難得知到底是哪個服務出了問題導致的,這時就需要解決一個問題,如何快速定位服務故障點,於是,分散式系統呼叫鏈追蹤技術就此誕生了。 ZipKin

Spring Cloud(Finchley.RELEASE版本)服務學習實踐:6.2全追蹤監控-Zipkin

環境:jdk1.8;spring boot2.0.3;spring cloud(Finchley.RELEASE版本);Maven3.3摘要說明:Zipkin:Zipkin是一個分散式追蹤系統。它有助於收集解決微服務架構中的延遲問題所需的時序資料。它管理這些資料的收集和查詢。

Spring Cloud服務架構(十三)服務追蹤(Spring Cloud Sleuth)

1、zipkin簡介 Spring Cloud Sleuth 主要功能就是在分散式系統中提供追蹤解決方案,並且相容支援了 zipkin,zipkin為分散式鏈路呼叫監控系統,聚合各業務系統呼叫延遲資料,達到鏈路呼叫監控跟蹤。 隨著微服務數量不斷增長,它們之間的關係會越來越複雜

服務SpringCloud之zipkin追蹤

 隨著業務發展,系統拆分導致系統呼叫鏈路愈發複雜一個前端請求可能最終需要呼叫很多次後端服務才能完成,當整個請求變慢或不可用時,我們是無法得知該請求是由某個或某些後端服務引起的,這時就需要解決如何快讀定位服務故障點,以對症下藥。於是就有了分散式系統呼叫跟蹤的誕生。 Spring Cloud Sleut

SpringBoot之服務日誌追蹤

SpringBoot之微服務日誌鏈路追蹤 簡介 在微服務裡,業務出現問題或者程式出的任何問題,都少不了檢視日誌,一般我們使用 ELK 相關的日誌收集工具,服務多的情況下,業務問題也是有些難以排查,只能確定大致時間定位相關日誌。log-trace-spring-boot-starter 解決多個服務呼叫日誌的問

spring cloud服務快速教程之(十一) Sleuth(zipkin) 服務追蹤

0、前言    微服務架構上眾多微服務通過REST呼叫,可能需要很多個服務協同才能完成一個介面功能,如果鏈路上任何一個服務出現問題或者網路超時,都會形成導致介面呼叫失敗。隨著業務的不斷擴張,服務之間互相呼叫會越來越複雜。如何清晰地記錄服務的呼叫鏈路,方便將來問題的定位,Spring cloud sleuth元

服務框架Demo.MicroServer中新增SkyWalking+SkyApm-dotnet分散式追蹤系統

1.APM工具的選取 Apm監測工具很多,這裡選用網上比較火的一款Skywalking。 Skywalking是一個應用效能監控(APM)系統,Skywalking分為服務端Oap、管理介面UI、以及嵌入到程式中的探針Agent部分,大概工作流程就是在程式中新增探針採集各種資料傳送給服務端儲存,然後在UI介面

net core 服務框架 Viper 呼叫追蹤

1、Viper是什麼?   Viper 是.NET平臺下的Anno微服務框架的一個示例專案。入門簡單、安全、穩定、高可用、全平臺可監控。底層通訊可以隨意切換thrift grpc。 自帶服務發現、呼叫鏈追蹤、Cron 排程、限流、事件匯流排、CQRS 、DDD、類似MVC的開發體驗,外掛化

服務 - 如何解決追蹤問題

### 一、鏈路追蹤 ​ 微服務架構是將單個應用程式被劃分成各種小而連線的服務,每一個服務完成一個單一的業務功能,相互之間保持獨立和解耦,每個服務都可以獨立演進。相對於傳統的單體服務,微服務具有隔離性、技術異構性、可擴充套件性以及簡化部署等優點。 ​ 同樣的,微服務架構在帶來諸多益處的同時,也為系統增

【開源】.net服務開發引擎Anno 讓複雜的事簡單點- 日誌、追蹤一目瞭然 (上)

1、Anno簡介?  Anno是一個微服務框架引擎。入門簡單、安全、穩定、高可用、全平臺視覺化監控、依賴第三方框架少。詳情請檢視《【開源】.net微服務開發引擎Anno開源啦》    本章主題:.net微服務開發引擎Anno 讓複雜的事簡單點- 日誌、鏈路追蹤一目瞭然  &n

業余草 SpringCloud教程 | 第九篇: 服務追蹤(Spring Cloud Sleuth)(Finchley版本)

描述 -s util ont packaging tdd res [] 新建 這篇文章主要講述服務追蹤組件zipkin,Spring Cloud Sleuth集成了zipkin組件。 一、簡介 Add sleuth to the classpath of a Spr

阿裏雲發布追蹤服務Tracing Analysis

product ffffff pro cin click 追蹤 com 拓撲 開源項目 摘要: 近日,在杭州雲棲大會上,阿裏雲發布了鏈路追蹤服務Tracing Analysis,成本是自建鏈路追蹤系統的1/5或更少,可為分布式應用的開發者提供完整的調用鏈路還原、調用請求量統

spring cloud 服務追蹤

簡介 Spring cloud Sleuth主要功能就是在分散式系統中提供追蹤解決方案,並且相容支援zipkin,你只需要在pom檔案中引入相應的依賴即可。 1、span 基本工作單元,span在不斷的啟動和停止,同時記錄了時間資訊,當你建立一相span,你必須在未來的某個時刻停止它。

SpringCloud2.0版本入門 | 服務追蹤(Spring Cloud Sleuth)簡單入門

本文出自 [ 慌途L ] 最近開始寫部落格,一些問題可能瞭解也不夠透徹,寫一下快速入門並且踩過的坑,希望大家少踩坑。本文簡單介紹一下springcloud的服務鏈路追蹤,不足之處希望大家指出,我改正。不喜勿噴! 這篇文章主要講述服務追蹤元件zipkin,Spr

Spring Cloud Sleuth服務追蹤(mysql儲存資料)(Finchley版本)

在Spring Cloud Sleuth服務鏈路追蹤(Finchley版本)中,我們使用Spring Cloud Sleuth和zipkin的整合實現了服務鏈路的追蹤,但是遺憾的是鏈路資料儲存在記憶體中,無法持久化。zipkin的持久化可以結合Elasticsearch,MySQL實現。本節

阿里雲釋出追蹤服務Tracing Analysis,從此告別告別日誌查詢

近日,在杭州雲棲大會上,阿里雲釋出了鏈路追蹤服務Tracing Analysis,成本是自建鏈路追蹤系統的1/5或更少,可為分散式應用的開發者提供完整的呼叫鏈路還原、呼叫請求量統計、鏈路拓撲、應用依賴分析等工具,幫助開發者快速分析和診斷分散式應用架構下的效能瓶頸,提高微服務時代下的開發診斷效

zipkin搭建springcloud追蹤服務注意事項

1、不需要在方法中列印日誌,會自動構建起跟蹤機制; 2、spring.application.name 不能包含下劃線,因為在eureka中java.net.URI不能區分下劃線,否則在進行服務呼叫的時候報錯(host name may not be null); 3、日誌中[demo-tr