億級用戶下的新浪微博平臺架構

億級用戶下的新浪微博平臺架構

序言
   


新浪微博在2014年3月公布的月活躍用戶(MAU)已經達到1.43億,2014年新年第一分鐘發送的微博達808298條,如此巨大的用戶規模和業務量,需要高可用(HA)、高并發訪問、低延時的強大后臺系統支撐。


微博平臺第一代架構為LAMP架構,數據庫使用的是MyIsam,后臺用的是php,緩存為Memcache。

隨著應用規模的增長,衍生出的第二代架構對業務功能進行了模塊化、服務化和組件化,后臺系統從php替換為Java,逐漸形成SOA架構,在很長一段時間支撐了微博平臺的業務發展。


在此基礎上又經過長時間的重構、線上運行、思索與沉淀,平臺形成了第三代架構體系。


我們先看一張微博的核心業務圖(如下),是不是非常復雜?但這已經是一個簡化的不能再簡化的業務圖了,第三代技術體系就是為了保障在微博核心業務上快速、高效、可靠地發布新產品新功能。

億級用戶下的新浪微博平臺架構

第三代技術體系
   


微博平臺的第三代技術體系,使用正交分解法建立模型:在水平方向,采用典型的三級分層模型,即接口層、服務層與資源層;在垂直方向,進一步細分為業務架構、技術架構、監控平臺與服務治理平臺。下面是平臺的整體架構圖:

億級用戶下的新浪微博平臺架構


如上圖所示,正交分解法將整個圖分解為3*4=12個區域,每個區域代表一個水平維度與一個垂直維度的交點,相應的定義這個區域的核心功能點,比如區域5主要完成服務層的技術架構。


下面詳細介紹水平方向與垂直方向的設計原則,尤其會重點介紹4、5、6中的技術組件及其在整個架構體系中的作用。


水平分層
   


水平維度的劃分,在大中型互聯網后臺業務系統的設計中非?;A,在平臺的每一代技術體系中都有體現。這里還是簡單介紹一下,為后續垂直維度的延伸講解做鋪墊:


1,接口層主要實現與Web頁面、移動客戶端的接口交互,定義統一的接口規范,平臺最核心的三個接口服務分別是內容(Feed)服務、用戶關系服務及通訊服務(單發私信、群發、群聊)。


2,服務層主要把核心業務模塊化、服務化,這里又分為兩類服務,一類為原子服務,其定義是不依賴任何其他服務的服務模塊,比如常用的短鏈服務、發號器服務都屬于這一類。圖中使用泳道隔離,表示它們的獨立性。另外一類為組合服務,通過各種原子服務和業務邏輯的組合來完成服務,比如Feed服務、通訊服務,它們除了本身的業務邏輯,還依賴短鏈、用戶及發號器服務。


3,資源層主要是數據模型的存儲,包含通用的緩存資源Redis和Memcached,以及持久化數據庫存儲MySQL、HBase,或者分布式文件系統TFS以及Sina S3服務。


水平分層有一個特點,依賴關系都是從上往下,上層的服務依賴下層,下層的服務不會依賴上層,構建了一種簡單直接的依賴關系。


與分層模型相對應,微博系統中的服務器主要包括三種類型:前端機(提供 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由技術團隊搭建框架,應用在所有業務場景中,運維基于此系統完善監控平臺,業務和運維共同使用此系統,完成分布式服務治理,包括服務擴容與縮容、服務降級、流量切換、服務發布與灰度。


結尾
   


現在,技術框架在平臺發揮著越來越重要的作用,驅動著平臺的技術升級、業務開發、系統運維服務,本文限于篇幅限制,沒有展開介紹,后續會不斷地介紹核心中間件的設計原則和系統架構。


關于作者
   


衛向軍(@衛向軍_微博),畢業于北京郵電大學,現任微博平臺架構師,先后在微軟、金山云、新浪微博從事技術研發工作,專注于系統架構設計、音視頻通訊系統、分布式文件系統和數據挖掘等領域。


【編者按】本文選自InfoQ專欄《博文共賞》,欄目精選來自國內外技術社區和個人博客上的技術文章,讓更多的讀者朋友受益,本文首發于“微博平臺架構”微信公眾號,發布時有少量的文字潤色和調整,轉載經原作者授權。

原創文章,作者:stanley,如若轉載,請注明出處:http://www.www58058.com/1237

(0)
stanleystanley
上一篇 2015-03-16 10:08
下一篇 2015-03-17 11:31

相關推薦

  • LINUX初次見面

    LINUX的文件系統 在Linux的眼睛中,一切都為文件,這也是Linux的中心哲學思想。正因如此造就了一個性能穩定,功能強大,效率高的操作系統。Linux有自己的層級標準,它定義了每個系統分區的用途,和所需要的最小構成文件目錄。由不同的文件來完成不同的功能造就了一個Linux的完整生態。 linux的文件系統格式比較豐富,它的核心系統能支持十多種文件系統類…

    2017-05-18
  • 下載編譯安裝httpd 2.4最新版本

    關于這個問題分三步講:1.下載最新版本;2.編譯;3.安裝 一:下載httpd 2.4的最新版本:(這里以Centos 7為例,Centos 6里用的是2.2版本的) 下載的話如何找下載路徑—–>下載后是存在windows下,如何將其移進linux中  1.下載路徑: 當然我們現在只要是碰到不會或者不知道的東西,通常會…

    2017-08-26
  • N25-第4周作業(用戶權限,grep用法)

    復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有訪問權限.      [root@bogon ~]# chmod -R o=—,g=— /home/tuser1/ [root@bogon ~]# chmod -R o=,g= /home/tuser1/ 編輯/etc/…

    Linux干貨 2016-12-26
  • wk_02 作業

    Linux 文件管理命令 cp命令 功能 Linux 系統中cp命令是用來復制目錄/文件的。 概要 單源復制 cp [OPTION]… [-T] SOURCE DEST DEST不存在則事先創建此文件,并復制源文件的數據流至DEST中; DEST存在 DEST是非目錄文件:則覆蓋目標文件; DEST是目錄文件:則先…

    Linux干貨 2016-12-11
  • keepalive配置文件詳解

    第一部分:全局定義塊 1、email通知。作用:有故障,發郵件報警。 2、Lvs負載均衡器標識(lvs_id)。在一個網絡內,它應該是唯一的。 3、花括號“{}”。用來分隔定義塊,因此必須成對出現。如果寫漏了,keepalived運行時,不會得到預期的結果。由于定義塊內存在嵌套關系,因此很容易遺漏結尾處的花括號,這點要特別注意。 global_defs{ n…

    2017-09-17
  • Linux 用戶、用戶組及權限管理

    一、Linux用戶及用戶組的基本概念 用戶:用戶是實現能夠將有限的資源在多個使用者之間進行分配;、 用戶組:用戶組是指多個用戶的集合,方便對一類需要同樣權限的用戶授權 Linux是多用戶、多任務的操作系統。     多用戶指:多人同時使用系統資源;多任務:同時運行多個進程 二、用戶及用戶組類別 1、用戶:名稱解析庫 /…

    Linux干貨 2016-03-20
欧美性久久久久