微博平臺的第三代技術體系,使用正交分解法創建模型:在水平方向,採用典型的三級分層模型,即接口層、服務層與資源層;在垂直方向,進一步細分爲業務架構、技術架構、監控平臺與服務治理平臺。下面是平臺的總體架構圖:前端
如上圖所示,正交分解法將整個圖分解爲3*4=12個區域,每一個區域表明一個水平維度與一個垂直維度的交點,相應的定義這個區域的核心功能點,好比區域5主要完成服務層的技術架構。mysql
下面詳細介紹水平方向與垂直方向的設計原則,尤爲會重點介紹四、五、6中的技術組件及其在整個架構體系中的做用。redis
水平維度的劃分,在大中型互聯網後臺業務系統的設計中很是基礎,在平臺的每一代技術體系中都有體現。這裏仍是簡單介紹一下,爲後續垂直維度的延伸講解作鋪墊:sql
接口層主要實現與Web頁面、移動客戶端的接口交互,定義統一的接口規範,平臺最核心的三個接口服務分別是內容(Feed)服務、用戶關係服務及通信服務(單發私信、羣發、羣聊)。數據庫
服務層主要把核心業務模塊化、服務化,這裏又分爲兩類服務,一類爲原子服務,其定義是不依賴任何其餘服務的服務模塊,好比經常使用的短鏈服務、發號器服務都屬於這一類。圖中使用泳道隔離,表示它們的獨立性。另一類爲組合服務,經過各類原子服務和業務邏輯的組合來完成服務,好比Feed服務、通信服務,它們除了自己的業務邏輯,還依賴短鏈、用戶及發號器服務。json
資源層主要是數據模型的存儲,包含通用的緩存資源Redis和Memcached,以及持久化數據庫存儲MySQL、HBase,或者分佈式文件系統TFS以及Sina S3服務。數組
水平分層有一個特色,依賴關係都是從上往下,上層的服務依賴下層,下層的服務不會依賴上層,構建了一種簡單直接的依賴關係。緩存
與分層模型相對應,微博系統中的服務器主要包括三種類型:前端機(提供 API 接口服務)、隊列機(處理上行業務邏輯,主要是數據寫入)和存儲(mc、mysql、mcq、redis 、HBase等)。服務器
隨着業務架構的發展和優化,平臺研發實現了許多卓越的中間件產品,用來支撐核心業務,這些中間件由業務驅動產生,隨着技術組件愈來愈豐富,造成完備的平臺技術框架,大大提高了平臺的產品研發效率和業務運行穩定性。網絡
區別於水平方向上層依賴下層的關係,垂直方向以技術框架爲地基支撐點,向兩側驅動影響業務架構、監控平臺、服務治理平臺,下面介紹一下其中的核心組件。
接口框架簡化和規範了業務接口開發工做,將通用的接口層功能打包到框架中,採用了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帶來的數據庫訪問壓力。
如今,技術框架在平臺發揮着愈來愈重要的做用,驅動着平臺的技術升級、業務開發、系統運維服務,本文限於篇幅限制,沒有展開介紹,後續會不斷地介紹核心中間件的設計原則和系統架構。