1. 程式人生 > >億級使用者下的新浪微博平臺架構解析

億級使用者下的新浪微博平臺架構解析

日誌君導讀:

1.43億的月活躍使用者,一分鐘微博達808298條,如此巨大的使用者規模和業務量,微博的後臺系統到底是什麼樣,本文帶你去看看。

【編者按】《博文共賞》是InfoQ中文站新推出的一個專欄,精選來自國內外技術社群和個人部落格上的技術文章,讓更多的讀者朋友受益,本欄目轉載的內容都經過原作者授權。文章推薦可以傳送郵件到[email protected]

序言

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

微博平臺第一代架構為LAMP架構,資料庫使用的是MyIsam,後臺用的是php,快取為Memcache。

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

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

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


第三代技術體系

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


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

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

水平分層

水平維度的劃分,在大中型網際網路後臺業務系統的設計中非常基礎,在平臺的每一代技術體系中都有體現。這裡還是簡單介紹一下,為後續垂直維度的延伸講解做鋪墊:

  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由技術團隊搭建框架,應用在所有業務場景中,運維基於此係統完善監控平臺,業務和運維共同使用此係統,完成分散式服務治理,包括服務擴容與縮容、服務降級、流量切換、服務釋出與灰度。

結尾

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

本文首發於“微博平臺架構”微信公眾號,釋出時有少量的文字潤色和調整。

關於作者

衛向軍(@衛向軍_微博),畢業於北京郵電大學,現任微博平臺架構師,先後在微軟、金山雲、新浪微博從事技術研發工作,專注於系統架構設計、音視訊通訊系統、分散式檔案系統和資料探勘等領域。

相關推薦

使用者平臺架構解析

日誌君導讀: 1.43億的月活躍使用者,一分鐘微博達808298條,如此巨大的使用者規模和業務量,微博的後臺系統到底是什麼樣,本文帶你去看看。 【編者按】《博文共賞》是InfoQ中文站新推出的一個專欄,精選來自國內外技術社群和個人部落格上的技術文章,讓更

使用者平臺架構

序言 新浪微博在2014年3月公佈的月活躍使用者(MAU)已經達到1.43億,2014年新年第一分鐘傳送的微博達808298條,如此巨大的使用者規模和業務量,需要高可用(HA)、高併發訪問、低延時的強大後臺系統支撐。 微博平臺第一代架構為LAMP架構,資料庫使用的是MyIsam,後臺用的是php,快取為Me

技術架構

中國首屆微博開發者大會於2010年11月在北京舉行,這是國內微博行業的首場技術盛宴。作為國內微博市場的絕對領軍者,新浪微博將在此次大會上公佈一系列針對開發者的扶持政策,以期與第三方開發者聯手推動微博行業的整體發展。下文為微博平臺首席架構師楊衛華演講。以下為演講實錄:大家下午好

技術架構分析-轉載

中國首屆微博開發者大會在北京舉行,這是國內微博行業的首場技術盛宴。作為國內微博市場的絕對領軍者,新浪微博將在此次大會上公佈一系列針對開發者的扶持政策,以期與第三方開發者聯手推動微博行業的整體發展。圖為微博平臺首席架構師楊衛華演講。以下為演講實錄:大家下午好,在座的大部分都是技

首席架構師漫談底層架構

 大家下午好,在座的大部分都是技術開發者,技術開發者往往對微博這個產品非常關心。最晚的一次,是12點多收到一個郵件說想了解一下微博底層是怎麼構架的。很多技術人員對微博的構架非常感興趣,就是一個明星他有300萬粉絲,這個技術怎麼來實現?今天在這裡跟大家分享一下微博的底層機構

:絕境逢生處,務實精神驅動的技術成熟

2009年初夏,一個已經接近完工的大專案“朋友”團隊,在理想國際大廈面向新浪CEO曹國偉等人做了兩個多小時的產品彙報,這款定位在社交場景下的產品,被決策層判定“沒明白核心賣點是什麼”、“產品不夠簡單、不具傳播性”。 “朋友”在新浪互動社群部研發兩年後終遭擱淺。彼時,新浪部落格的風頭漸弱,新浪亟待尋找一個新的

千萬規模高效能、高併發的網路架構經驗分享

架構以及我理解中架構的本質 在開始談我對架構本質的理解之前,先談談對今天技術沙龍主題的個人見解,千萬級規模的網站感覺數量級是非常大的,對這個數量級我們戰略上要重視它,戰術上又要藐視它。 先舉個例子感受一下千萬級到底是什麼數量級?現在很流行的優步(Uber),從媒體

Android自定義控制(五)仿拉重新整理

網上有很多很有名的開源框架,這裡就來拉拉PullToRefresh這個框架,也就是我們平時用的下拉重新整理啦,當然你問我這個有什麼用啊?別人已經寫好了,這裡主要是學習以及練習,練習的次數多了,一切就順其自然的會了. 廢話少說,先上圖,再上程式碼: 1.要想實現下拉重新整理

最新python爬蟲抓取千萬資料,scrapy思路+架構+原始碼

1.1 爬取目標 爬取的目標是新浪微博使用者的公開基本資訊,如使用者暱稱、頭像、使用者的關注、粉絲列表以及釋出的微博等 1.2 準備工作     代理池、 Cookies 池已經實現並可以正常執行,安裝 Scrap

基於的男女性擇偶觀資料分析()

  各位朋友,大家好,我是Payne,歡迎大家關注我的部落格。我的部落格地址是:https://qinyuanpei.github.io。對於今天這篇文章的主題,相信經常關注我部落格的朋友一定不會陌生。因為在2017年年底的時候,我曾以此為題寫作了一篇文章:基於

python 爬蟲1 開始,先拿開始

大括號 版本 install esp con data- 定位 ble Language 剛剛開始學。 目的地是兩個。一個微博,一個貼吧 存入的話,臨時還沒想那麽多。先存到本地目錄吧 分詞和推薦後面在整合 mysql mongodb hadoop redius 後面在用

[數據集]數據集MicroblogPCU

sets learning lun epo con 新浪 摘要 get 關系 數據集下載地址:下載 摘要:MicroblogPCU是從新浪微博採集到的。它能夠被用於研究機器學習方法和社會關系研究。 這個數據集被原作者用於探索微博中的spammers(發送垃圾信息的人)。

java parse 帶英文單詞的日期字符串 轉 date (轉化api返回的時間)

site ats 技術 cnblogs local 隨筆 html5 null 就會 拂曉風起 專註前端技術cocos2d、js、flash、html5,聯系:[email protected]/* */,請不吝推薦簡歷。 博客園 首頁

分享鏈接代碼

地址 php 微博 新浪 ref http href .com targe <a href="http://service.weibo.com/share/share.php?url=分享的網址;title=標題內容&amp;pic=分享的圖片地址" targ

基於混合雲的PHP服務化與彈性擴容

服務器 新浪微博 雲平臺 突發事件 白百合 從後端來講,新浪微博可以分為Java和LNMP兩大體系,特別是在LNMP方面積累了很多經驗。發展初期,新浪微博側重從性能角度出發,做架構方面的調整和優化。近兩年,它投入人力、物力,把重點放在了彈性擴容方面。本文由在新浪微博工作近七年、現任主站研發

apigw鑒權分析(1-4)開放平臺 - 鑒權分析

取消 spa 控制 server 信息 des 包含 flash poi 一、訪問入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博開放接口的

share分享接口請求奇葩錯誤

安全 配置域名 問題 如果 sha 實時 名稱 錯誤 限制 17年6月30號,微博正式轉入牛逼狀態; 限制原來的微博發布刪除等接口;(想用就開套餐,不然別說話) 開放新的分享接口share,然而,在調用這個分享接口時候,就會出現各種各樣的奇葩錯誤; 註意事項:

在Android中使App高速、簡單地支持信、QQ、facebook等十幾個主流社交平臺的分享功能

分析 ont renren androidm mod 執行 xen 12px 操作 前言 在如今的APP或者遊戲中,分享功能差點兒已經成為標配。分享功能不但能夠滿足用戶的需求。也能夠為產品帶來很多其它的用戶,甚至能夠對用戶的行為、活躍度、年齡段等情況進行數據統計,使得軟

(一一六)client的離線緩存實現思路

aso 離線 要求 北京 ... comm roo rep 功能 上一節(一一五)利用NSKeyedArchiver實現隨意對象轉為二進制介紹了將隨意對象轉化為二進制數據和還原的方法。可用於實現本節介紹的微博數據離線緩存。 通過新浪官方的API能夠發現,返回的微博

iOS之 接入 SDK(信支付) 的坑(registerApp 的問題)

com .net symbols object type lan creat manager -o 最近在做一個 iOS 的 cocos2d-x 項目接入新浪微博 SDK 的時候被“坑”了,最後終於順利的解決了。發現網上也有不少人遇到一樣的問題,但是能找到的數量有限的解決辦