微博平臺第一代架構爲LAMP架構,數據庫使用的是MyIsam,後臺用的是php,緩存爲Memcache。
隨着應用規模的增加,衍生出的第二代架構對業務功能進行了模塊化、服務化和組件化,後臺系統從php替換爲Java,逐漸造成SOA架構,在很長一段時間支撐了微博平臺的業務發展。
在此基礎上又通過長時間的重構、線上運行、思索與沉澱,平臺造成了第三代架構體系。
咱們先看一張微博的核心業務圖(以下),是否是很是複雜?但這已是一個簡化的不能再簡化的業務圖了,第三代技術體系就是爲了保障在微博核心業務上快速、高效、可靠地發佈新產品新功能。php
第三代技術體系前端
微博平臺的第三代技術體系,使用正交分解法創建模型:在水平方向,採用典型的三級分層模型,即接口層、服務層與資源層;在垂直方向,進一步細分爲業務架構、技術架構、監控平臺與服務治理平臺。下面是平臺的總體架構圖:mysql
如上圖所示,正交分解法將整個圖分解爲3*4=12個區域,每一個區域表明一個水平維度與一個垂直維度的交點,相應的定義這個區域的核心功能點,好比區域5主要完成服務層的技術架構。redis
下面詳細介紹水平方向與垂直方向的設計原則,尤爲會重點介紹四、五、6中的技術組件及其在整個架構體系中的做用。sql
水平分層數據庫
水平維度的劃分,在大中型互聯網後臺業務系統的設計中很是基礎,在平臺的每一代技術體系中都有體現。這裏仍是簡單介紹一下,爲後續垂直維度的延伸講解作鋪墊:json
水平分層有一個特色,依賴關係都是從上往下,上層的服務依賴下層,下層的服務不會依賴上層,構建了一種簡單直接的依賴關係。數組
與分層模型相對應,微博系統中的服務器主要包括三種類型:前端機(提供 API 接口服務)、隊列機(處理上行業務邏輯,主要是數據寫入)和存儲(mc、mysql、mcq、redis 、HBase等)。瀏覽器
垂直延伸技術架構緩存
隨着業務架構的發展和優化,平臺研發實現了許多卓越的中間件產品,用來支撐核心業務,這些中間件由業務驅動產生,隨着技術組件愈來愈豐富,造成完備的平臺技術框架,大大提高了平臺的產品研發效率和業務運行穩定性。
區別於水平方向上層依賴下層的關係,垂直方向以技術框架爲地基支撐點,向兩側驅動影響業務架構、監控平臺、服務治理平臺,下面介紹一下其中的核心組件。
接口層Web V4框架
接口框架簡化和規範了業務接口開發工做,將通用的接口層功能打包到框架中,採用了Spring的面向切面(AOP)設計理念。接口框架基於Jersey 進行二次開發,基於annotation定義接口(url, 參數),內置Auth、頻次控制、訪問日誌、降級功能,支撐接口層監控平臺與服務治理,同時還有自動化的Bean-json/xml序列化。
服務層框架
服務層主要涉及RPC遠程調用框架以及消息隊列框架,這是微博平臺在服務層使用最爲普遍的兩個框架。
MCQ消息隊列
消息隊列提供一種先入先出的通信機制,在平臺內部,最多見的場景是將數據的落地操做異步寫入隊列,隊列處理程序批量讀取並寫入DB,消息隊列提供的異步機制加快了前端機的響應時間,其次,批量的DB操做也間接提升了DB操做性能,另一個應用場景,平臺經過消息隊列,向搜索、大數據、商業運營部門提供實時數據。
微博平臺內部大量使用的MCQ(SimpleQueue Service Over Memcache)消息隊列服務,基於MemCache協議,消息數據持久化寫入BerkeleyDB,只有get/set兩個命令,同時也很是容易作監控(stats queue),有豐富的client library,線上運行多年,性能比通用的MQ高不少倍。
Motan RPC框架
微博的Motan RPC服務,底層通信引擎採用了Netty網絡框架,序列化協議支持Hessian和Java序列化,通信協議支持Motan、http、tcp、mc等,Motan框架在內部大量使用,在系統的健壯性和服務治理方面,有較爲成熟的技術解決方案,健壯性上,基於Config配置管理服務實現了High Availability與Load Balance策略(支持靈活的FailOver和FailFast HA策略,以及Round Robin、LRU、Consistent Hash等Load Balance策略),服務治理方面,生成完整的服務調用鏈數據,服務請求性能數據,響應時間(Response Time)、QPS以及標準化Error、Exception日誌信息。
資源層框架
資源層的框架很是多,有封裝MySQL與HBase的Key-List DAL中間件、有定製化的計數組件,有支持分佈式MC與Redis的Proxy,在這些方面業界有較多的經驗分享,我在這裏分享一下平臺架構的對象庫與SSD Cache組件。
對象庫
對象庫支持便捷的序列化與反序列化微博中的對象數據:序列化時,將JVM內存中的對象序列化寫入在HBase中並生成惟一的ObjectID,當須要訪問該對象時,經過ObjectID讀取,對象庫支持任意類型的對象,支持PB、JSON、二進制序列化協議,微博中最大的應用場景將微博中引用的視頻、圖片、文章統必定義爲對象,一共定義了幾十種對象類型,並抽象出標準的對象元數據Schema,對象的內容上傳到對象存儲系統(Sina S3)中,對象元數據中保存Sina S3的下載地址。
SSDCache
隨着SSD硬盤的普及,優越的IO性能使其被愈來愈多地用於替換傳統的SATA和SAS磁盤,常見的應用場景有三種:1)替換MySQL數據庫的硬盤,目前社區尚未針對SSD優化的MySQL版本,即便這樣,直接升級SSD硬盤也能帶來8倍左右的IOPS提高;2)替換Redis的硬盤,提高其性能;3)用在CDN中,加快靜態資源加載速度。
微博平臺將SSD應用在分佈式緩存場景中,將傳統的Redis/MC + Mysql方式,擴展爲 Redis/MC + SSD Cache + Mysql方式,SSD Cache做爲L2緩存使用,第一下降了MC/Redis成本太高,容量小的問題,也解決了穿透DB帶來的數據庫訪問壓力。
垂直的監控與服務治理
隨着服務規模和業務變得愈來愈複雜,即便業務架構師也很難準確地描述服務之間的依賴關係,服務的管理運維變得越來難,在這個背景下,參考google的dapper和twitter的zipkin,平臺實現了本身的大型分佈式追蹤系統WatchMan。
WatchMan大型分佈式追蹤系統
如其餘大中型互聯網應用同樣,微博平臺由衆多的分佈式組件構成,用戶經過瀏覽器或移動客戶端的每個HTTP請求到達應用服務器後,會通過不少個業務系統或系統組件,並留下足跡(footprint)。可是這些分散的數據對於問題排查,或是流程優化都幫助有限。對於這樣一種典型的跨進程/跨線程的場景,彙總收集並分析這類日誌就顯得尤其重要。另外一方面,收集每一處足跡的性能數據,並根據策略對各子系統作流控或降級,也是確保微博平臺高可用的重要因素。要能作到追蹤每一個請求的完整調用鏈路;收集調用鏈路上每一個服務的性能數據;能追蹤系統中全部的Error和Exception;經過計算性能數據和比對性能指標(SLA)再回饋到控制流程(control flow)中,基於這些目標就誕生了微博的Watchman系統。
該系統設計的一個核心原則就是低侵入性(non-invasivenss):做爲非業務組件,應當儘量少侵入或者不侵入其餘業務系統,保持對使用方的透明性,能夠大大減小開發人員的負擔和接入門檻。基於此考慮,全部的日誌採集點都分佈在技術框架中間件中,包括接口框架、RPC框架以及其餘資源中間件。
WatchMan由技術團隊搭建框架,應用在全部業務場景中,運維基於此係統完善監控平臺,業務和運維共同使用此係統,完成分佈式服務治理,包括服務擴容與縮容、服務降級、流量切換、服務發佈與灰度。
結尾
如今,技術框架在平臺發揮着愈來愈重要的做用,驅動着平臺的技術升級、業務開發、系統運維服務,本文限於篇幅限制,沒有展開介紹,後續會不斷地介紹核心中間件的設計原則和系統架構。