當前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]架構(gòu)以及我理解中架構(gòu)的本質(zhì) 在開始談我對架構(gòu)本質(zhì)的理解之前,先談?wù)勛约旱膫€人見解,千萬級規(guī)模的網(wǎng)站感覺數(shù)量級是非常大的,對這個數(shù)量級我們戰(zhàn)略上要重視它 ,戰(zhàn)術(shù)上又要藐視它。


架構(gòu)以及我理解中架構(gòu)的本質(zhì)

在開始談我對架構(gòu)本質(zhì)的理解之前,先談?wù)勛约旱膫€人見解,千萬級規(guī)模的網(wǎng)站感覺數(shù)量級是非常大的,對這個數(shù)量級我們戰(zhàn)略上要重視它 ,戰(zhàn)術(shù)上又要藐視它。

先舉個例子感受一下千萬級到底是什么數(shù)量級?現(xiàn)在的優(yōu)步(Uber),從媒體公布的信息看,它每天接單量平均在百萬左右,假如每天有10個小時的服務(wù)時間,平均QPS只有30左右。

對于一個后臺服務(wù)器,單機的平均QPS可以到達800-1000,單獨看寫的業(yè)務(wù)量很簡單 。為什么我們又不能說輕視它?

第一,我們看它的數(shù)據(jù)存儲,每天一百萬的話,一年數(shù)據(jù)量的規(guī)模是多少?其次,剛才說的訂單量,每一個訂單要推送給附近的司機、司機要并發(fā)搶單,后面業(yè)務(wù)場景的訪問量往往是前者的上百倍,輕松就超過上億級別了。

今天我想從架構(gòu)的本質(zhì)談起之后,希望大家理解在做一些建構(gòu)設(shè)計的時候,它的出發(fā)點以及它解決的問題是什么。

架構(gòu),剛開始的解釋是我從知乎上看到的。什么是架構(gòu)?有人講, 說架構(gòu)并不是一 個很懸乎的 東西 , 實際 上就是一個架子 ,放一些 業(yè)務(wù) 和算法,跟我們的生活中的晾衣架很像。更抽象一點,說架構(gòu)其實是對我們重復(fù)性業(yè)務(wù)的抽象和我們未來業(yè)務(wù)拓展的前瞻,強調(diào)過去的經(jīng)驗和你對整個行業(yè)的預(yù)見。

我們要想做一個架構(gòu)的話需要哪些能力?我覺得最重要的是架構(gòu)師一個最重要的能力就是你要有戰(zhàn)略分解能力。這個怎么來看呢:

第一,你必須要有抽象的能力,抽象的能力最基本就是去重,去重在整個架構(gòu)中體現(xiàn)在方方面面,從定義一個函數(shù),到定義一個類,到提供的一個服務(wù),以及模板,背后都是要去重提高可復(fù)用率。

第二, 分類能力。做軟件需要做對象的解耦,要定義對象的屬性和方法,做分布式系統(tǒng)的時候要做服務(wù)的拆分和模塊化,要定義服務(wù)的接口和規(guī)范。

第三, 算法(性能),它的價值體現(xiàn)在提升系統(tǒng)的性能,所有性能的提升,最終都會落到CPU,內(nèi)存,IO和網(wǎng)絡(luò)這4大塊上。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

這一頁PPT舉了一些例子來更深入的理解常見技術(shù)背后的架構(gòu)理念。

第一個例子,在分布式系統(tǒng)我們會做 MySQL分庫分表,我們要從不同的庫和表中讀取數(shù)據(jù),這樣的抽象最直觀就是使用模板,因為絕大多數(shù)SQL語義是相同的,除了路由到哪個庫哪個表,如果不使用Proxy中間件,模板就是性價比最高的方法。

第二看一下加速網(wǎng)絡(luò)的CDN,它是做速度方面的性能提升,剛才我們也提到從CPU、內(nèi)存、IO、網(wǎng)絡(luò)四個方面來考慮,CDN本質(zhì)上一個是做網(wǎng)絡(luò)智能調(diào)度優(yōu)化,另一個是多級緩存優(yōu)化。

第三個看一下服務(wù)化,剛才已經(jīng)提到了,各個大網(wǎng)站轉(zhuǎn)型過程中一定會做服務(wù)化,其實它就是做抽象和做服務(wù)的拆分。第四個看一下消息隊列,本質(zhì)上還是做分類,只不過不是兩個邊際清晰的類,而是把兩個邊際不清晰的子系統(tǒng)通過隊列解構(gòu)并且異步化。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

新浪微博整體架構(gòu)是什么樣的

接下我們看一下微博整體架構(gòu),到一定量級的系統(tǒng)整個架構(gòu)都會變成三層,客戶端包括WEB、安卓和IOS,這里就不說了。

接著還都會有一個接口層, 有三個主要作用:

第一個作用,要做 安全隔離,因為前端節(jié)點都是直接和用戶交互,需要防范各種惡意攻擊;

第二個還充當著一個 流量控制的作用,大家知道,在2014年春節(jié)的時候,微信紅包,每分鐘8億多次的請求,其實真正到它后臺的請求量,只有十萬左右的數(shù)量級(這里的數(shù)據(jù)可能不準),剩余的流量在接口層就被擋住了;

第三,我們看對PC端和移動端的需求不一樣的,所以我們可以進行拆分。接口層之后是后臺,可以看到微博后臺有三大塊:

一個是平臺服務(wù),

第二, 搜索,

第三, 大數(shù)據(jù)。

到了后臺的各種服務(wù)其實都是處理的數(shù)據(jù)。像平臺的業(yè)務(wù)部門,做的就是數(shù)據(jù)存儲和讀取,對搜索來說做的是 數(shù)據(jù)的檢索,對大數(shù)據(jù)來說是做的數(shù)據(jù)的挖掘。微博其實和淘寶是很類似

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

微博其實和淘寶是很類似的。一般來說,第一代架構(gòu),基本上能支撐到用戶到 百萬 級別,到第二代架構(gòu)基本能支撐到 千萬 級別都沒什么問題,當業(yè)務(wù)規(guī)模到 億級別時,需要第三代的架構(gòu)。

從LAMP的架構(gòu)到面向服務(wù)的架構(gòu),有幾個地方是非常難的,首先不可能在第一代基礎(chǔ)上通過簡單的修修補補滿足用戶量快速增長的,同時線上業(yè)務(wù)又不能停,這是我們常說的在飛機上換引擎的問題。

前兩天我有一個朋友問我,說他在內(nèi)部推行服務(wù)化的時候,把一個模塊服務(wù)化做完了,其他部門就是不接。我建議在做服務(wù)化的時候,首先更多是偏向業(yè)務(wù)的梳理,同時要找準一個很好的切入點,既有架構(gòu)和服務(wù)化上的提升,業(yè)務(wù)方也要有收益,比如提升性能或者降低維護成本同時升級過程要平滑,建議開始從原子化服務(wù)切入,比如基礎(chǔ)的用戶服務(wù), 基礎(chǔ)的短消息服務(wù),基礎(chǔ)的推送服務(wù)。

第二,就是可 以做無狀 態(tài) 服 務(wù),后面會詳細講,還有數(shù)據(jù)量大了后需要做數(shù)據(jù)Sharding,后面會將。第三代 架構(gòu) 要解決的 問題,就是用戶量和業(yè)務(wù)趨于穩(wěn)步增加(相對爆發(fā)期的指數(shù)級增長),更多考慮技術(shù)框架的穩(wěn)定性, 提升系統(tǒng)整體的性能,降低成本,還有對整個系統(tǒng)監(jiān)控的完善和升級。

大型網(wǎng)站的系統(tǒng)架構(gòu)是如何演變的

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

我們通過通過數(shù)據(jù)看一下它的挑戰(zhàn),PV是在10億級別,QPS在百萬,數(shù)據(jù)量在千億級別。我們可用性,就是SLA要求4個9,接口響應(yīng)最多不能超過150毫秒,線上所有的故障必須得在5分鐘內(nèi)解決完。

如果說5分鐘沒處理呢?那會影響你年終的績效考核。2015年微博DAU已經(jīng)過億。我們系統(tǒng)有上百個微服務(wù),每周會有兩次的常規(guī)上線和不限次數(shù)的緊急上線。我們的挑戰(zhàn)都一樣,就是數(shù)據(jù)量,bigger and bigger,用戶體驗是faster and faster,業(yè)務(wù)是more and more。

互聯(lián)網(wǎng)業(yè)務(wù)更多是產(chǎn)品體驗驅(qū)動,技術(shù)在產(chǎn)品體驗上最有效的貢獻 ,就是你的性能越來越好 。每次降低加載一個頁面的時間,都可以間接的降低這個頁面上用戶的流失率。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計


微博的技術(shù)挑戰(zhàn)和正交分解法解析架構(gòu)

下面看一下第三代的架構(gòu)圖以及我們怎么用正交分解法闡述。

我們可以看到我們從兩個維度,橫軸和縱軸可以看到。一個維度是水平的分層 拆分,第二從垂直的維度會做拆分。水平的維度從接口層、到服務(wù)層到數(shù)據(jù)存儲層。垂直怎么拆分,會用業(yè)務(wù)架構(gòu)、技術(shù)架構(gòu)、監(jiān)控平臺、服務(wù)治理等等來處理。

我相信到第二代的時候很多架構(gòu)已經(jīng)有了業(yè)務(wù)架構(gòu)和技術(shù)架構(gòu)的拆分。我們看一下, 接口層有feed、用戶關(guān)系、通訊接口;服務(wù)層,SOA里有基層服務(wù)、原子服務(wù)和組合服務(wù),在微博我們只有原子服務(wù)和組合服務(wù)。原子服務(wù)不依賴于任何其他服務(wù),組合服務(wù)由幾個原子服務(wù)和自己的業(yè)務(wù)邏輯構(gòu)建而成 ,資源層負責海量數(shù)據(jù)的存儲(后面例子會詳細講)。

技術(shù)框架解決獨立于業(yè)務(wù)的海量高并發(fā)場景下的技術(shù)難題,由眾多的技術(shù)組件共同構(gòu)建而成 。在接口層,微博使用JERSY框架,幫助你做參數(shù)的解析,參數(shù)的驗證,序列化和反序列化;資源層,主要是緩存、DB相關(guān)的各類組件,比如Cache組件和對象庫組件。監(jiān) 控平臺和服 務(wù) 治理 ,完成系統(tǒng)服務(wù)的像素級監(jiān)控,對分布式系統(tǒng)做提前診斷、預(yù)警以及治理。包含了SLA規(guī)則的制定、服務(wù)監(jiān)控、服務(wù)調(diào)用鏈監(jiān)控、流量監(jiān)控、錯誤異常監(jiān)控、線上灰度發(fā)布上線系統(tǒng)、線上擴容縮容調(diào)度系統(tǒng)等。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

下面我們講一下常見的設(shè)計原則。

第一個,首先是系統(tǒng)架構(gòu)三個利器:

  • 一個, 我們RPC服務(wù)組件 (這里不講了),

  • 第二個,我們消息中間件 。消息中間件起的作用:可以把兩個模塊之間的交互異步化,其次可以把不均勻請求流量輸出為勻速的輸出流量,所以說消息中間件異步化解耦和流量削峰的利器。

  • 第三個是配置管理,它是代碼級灰度發(fā)布以及保障系統(tǒng)降級的利器。

第二個 , 無狀態(tài)接口層最重要的就是無狀態(tài)。

我們在電商網(wǎng)站購物,在這個過程中很多情況下是有狀態(tài)的,比如我瀏覽了哪些商品,為什么大家又常說接口層是無狀態(tài)的,其實我們把狀態(tài)從接口層剝離到了數(shù)據(jù)層。像用戶在電商網(wǎng)站購物,選了幾件商品,到了哪一步,接口無狀態(tài)后,狀態(tài)要么放在緩存中,要么放在數(shù)據(jù)庫中, 其實它并不是沒有狀 態(tài) , 只是在這個過程中我們要把一些有狀態(tài)的東西抽離出來到了數(shù)據(jù)層。

第三個, 數(shù)據(jù) 層 比服 務(wù)層 更需要 設(shè)計,這是一條非常重要的經(jīng)驗。對于服務(wù)層來說,可以拿PHP寫,明天你可以拿JAVA來寫,但是如果你的數(shù)據(jù)結(jié)構(gòu)開始設(shè)計不合理,將來數(shù)據(jù)結(jié)構(gòu)的改變會花費你數(shù)倍的代價,老的數(shù)據(jù)格式向新的數(shù)據(jù)格式遷移會讓你痛不欲生,既有工作量上的,又有數(shù)據(jù)遷移跨越的時間周期,有一些甚至需要半年以上。

第四,物理結(jié)構(gòu)與邏輯結(jié)構(gòu)的映射,上一張圖看到兩個維度切成十二個區(qū)間,每個區(qū)間代表一個技術(shù)領(lǐng)域,這個可以看做我們的邏輯結(jié)構(gòu)。另外,不論后臺還是應(yīng)用層的開發(fā)團隊,一般都會分幾個垂直的業(yè)務(wù)組加上一個基礎(chǔ)技術(shù)架構(gòu)組,這就是從物理組織架構(gòu)到邏輯的技術(shù)架構(gòu)的完美的映射,精細化團隊分工,有利于提高溝通協(xié)作的效率 。

第五, www .sanhao.com 的訪問過程,我們這個架構(gòu)圖里沒有涉及到的,舉個例子,比如當你在瀏覽器輸入www.sanhao網(wǎng)址的時候,這個請求在接口層之前發(fā)生了什么?首先會查看你本機DNS以及DNS服務(wù),查找域名對應(yīng)的IP地址,然后發(fā)送HTTP請求過去。這個請求首先會到前端的VIP地址(公網(wǎng)服務(wù)IP地址),VIP之后還要經(jīng)過負載均衡器(Nginx服務(wù)器),之后才到你的應(yīng)用接口層。在接口層之前發(fā)生了這么多事,可能有用戶報一個問題的時候,你通過在接口層查日志根本發(fā)現(xiàn)不了問題,原因就是問題可能發(fā)生在到達接口層之前了。

第六,我們說分布式系統(tǒng),它最終的瓶頸會落在哪里呢?前端時間有一個網(wǎng)友跟我討論的時候,說他們的系統(tǒng)遇到了一個瓶頸, 查遍了CPU,內(nèi)存,網(wǎng)絡(luò),存儲,都沒有問題。我說你再查一遍,因為最終你不論用上千臺服務(wù)器還是上萬臺服務(wù)器,最終系統(tǒng)出瓶頸的一定會落在某一臺機(可能是葉子節(jié)點也可能是核心的節(jié)點),一定落在CPU、內(nèi)存、存儲和網(wǎng)絡(luò)上,最后查出來問題出在一臺服務(wù)器的網(wǎng)卡帶寬上。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

微博多級雙機房緩存架構(gòu)

接下來我們看一下微博的Feed多級緩存。我們做業(yè)務(wù)的時候,經(jīng)常很少做業(yè)務(wù)分析,技術(shù)大會上的分享又都偏向技術(shù)架構(gòu)。其實大家更多的日常工作是需要花費更多時間在業(yè)務(wù)優(yōu)化上。

這張圖是統(tǒng)計微博的信息流前幾頁的訪問比例,像前三頁占了97%,在做緩存設(shè)計的時候,我們最多只存最近的M條數(shù)據(jù)。這里強調(diào)的就是做系統(tǒng)設(shè)計 要基于用 戶 的 場 景 , 越細致越好 。

舉了一個例子,大家都會用電商,電商在雙十一會做全國范圍內(nèi)的活動,他們做設(shè)計的時候也會考慮場景的,一個就是購物車,我曾經(jīng)跟相關(guān)開發(fā)討論過,購物車是在雙十一之前用戶的訪問量非常大,就是不停地往里加商品。在真正到雙十一那天他不會往購物車加東西了,但是他會頻繁的瀏覽購物車。針對這個場景,活動之前重點設(shè)計優(yōu)化購物車的寫場景, 活動開始后優(yōu)化購物車的讀場景。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計
微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

你看到的微博是由哪些部分聚合而成的呢?最右邊的是Feed,就是微博所有關(guān)注的人,他們的微博所組成的。微博我們會按照時間順序把所有關(guān)注人的順序做一個排序。

隨著業(yè)務(wù)的發(fā)展,除了跟時間序相關(guān)的微博還有非時間序的微博,就是會有廣告的要求,增加一些廣告,還有粉絲頭條,就是拿錢買的,熱門微博,都會插在其中。分發(fā)控制,就是說和一些推薦相關(guān)的,我推薦一些相關(guān)的好友的微博,我推薦一些你可能沒有讀過的微博,我推薦一些其他類型的微博。

當然對非時序的微博和分發(fā)控制微博,實際會起多個并行的程序來讀取,最后同步做統(tǒng)一的聚合。這里稍微分享一下, 從SNS社交領(lǐng)域來看,國內(nèi)現(xiàn)在做的比較好的三個信息流:

  • 微博 是 基于弱關(guān)系的媒體信息流 ;

  • 朋友圈是基于 強 關(guān)系的信息流 ;

  • 另外一個做的比 較 好的就是今日 頭 條 , 它并不是基于關(guān)系來構(gòu)建信息流 , 而是基于 興趣和相關(guān)性的個性化推薦 信息流 。

信息流的聚合,體現(xiàn)在很多很多的產(chǎn)品之中,除了SNS,電商里也有信息流的聚合的影子。比如搜索一個商品后出來的列表頁,它的信息流基本由幾部分組成:第一,打廣告的;第二個,做一些推薦,熱門的商品,其次,才是關(guān)鍵字相關(guān)的搜索結(jié)果。信息流 開始的時候很簡單 , 但是到后期會發(fā)現(xiàn) , 你的這 個流如何做控制分發(fā) , 非常復(fù)雜, 微博在最近一兩年一直在做這樣的工作。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

剛才我們是從業(yè)務(wù)上分析,那么技術(shù)上怎么解決高并發(fā),高性能的問題?微博訪問量很大的時候,底層存儲是用MySQL數(shù)據(jù)庫,當然也會有其他的。

對于查詢請求量大的時候,大家知道一定有緩存,可以復(fù)用可重用的計算結(jié)果??梢钥吹?,發(fā)一條微博,我有很多粉絲,他們都會來看我發(fā)的內(nèi)容,所以 微博是最適合使用緩存的系統(tǒng),微博的讀寫比例基本在幾十比一。

微博使用了雙層緩存,上面是L1,每個L1上都是一組(包含4-6臺機器),左邊的框相當于一個機房,右邊又是一個機房。在這個系統(tǒng)中L1緩存所起的作用是什么?

首先,L1 緩存增加整個系 統(tǒng) 的 QPS, 其次以低成本靈活擴容的方式增加系統(tǒng) 的 帶寬 。想象一個極端場景,只有一篇博文,但是它的訪問量無限增長,其實我們不需要影響L2緩存,因為它的內(nèi)容存儲的量小,但它就是訪問量大。這種場景下,你就需要使用L1來擴容提升QPS和帶寬瓶頸。

另外一個場景,就是L2級緩存發(fā)生作用,比如我有一千萬個用戶,去訪問的是一百萬個用戶的微博 ,這個時候,他不只是說你的吞吐量和訪問帶寬,就是你要緩存的博文的內(nèi)容也很多了,這個時候你要考慮緩存的容量, 第二 級緩 存更多的是從容量上來 規(guī)劃,保證請求以較小的比例 穿透到后端的數(shù)據(jù)庫中 ,根據(jù)你的用戶模型你可以估出來,到底有百分之多少的請求不能穿透到DB, 評估這個容量之后,才能更好的評估DB需要多少庫,需要承擔多大的訪問的壓力。

另外,我們看雙機房的話,左邊一個,右邊一個。兩個機房是互為主備 , 或者互 為熱備 。如果兩個用戶在不同地域,他們訪問兩個不同機房的時候,假設(shè)用戶從IDC1過來,因為就近原理,他會訪問L1,沒有的話才會跑到Master,當在IDC1沒找到的時候才會跑到IDC2來找。

同時有用戶從IDC2訪問,也會有請求從L1和Master返回或者到IDC1去查找。IDC1 和 IDC2 ,兩個機房都有全量的用戶數(shù)據(jù),同時在線提供服務(wù),但是緩存查詢又遵循最近訪問原理。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

還有哪些多級緩存的例子呢?CDN是典型的多級緩存。CDN在國內(nèi)各個地區(qū)做了很多節(jié)點,比如在杭州市部署一個節(jié)點時,在機房里肯定不止一臺機器,那么對于一個地區(qū)來說,只有幾臺服務(wù)器到源站回源,其他節(jié)點都到這幾臺服務(wù)器回源即可,這么看CDN至少也有兩級。

Local Cache+ 分布式緩存,這也是常見的一種策略。有一種場景,分布式緩存并不適用, 比如單點資源的爆發(fā)性峰值流量,這個時候使用Local Cache + 分布式緩存,Local Cache在應(yīng)用服務(wù)器上用很小的內(nèi)存資源擋住少量的極端峰值流量,長尾的流量仍然訪問分布式緩存,這樣的Hybrid緩存架構(gòu)通過復(fù)用眾多的應(yīng)用服務(wù)器節(jié)點,降低了系統(tǒng)的整體成本。

我們來看一下Feed的存儲架構(gòu),微博的博文主要存在MySQL中。首先來看內(nèi)容表,這個比較簡單,每條內(nèi)容一個索引,每天建一張表,其次看索引表,一共建了兩級索引。首先想象一下用戶場景,大部分用戶刷微博的時候,看的是他關(guān)注所有人的微博,然后按時間來排序。

仔細分析發(fā)現(xiàn)在這個場景下, 跟一個用戶的自己的相關(guān)性很小了。所以在一級索引的時候會先根據(jù)關(guān)注的用戶,取他們的前條微博ID,然后聚合排序。我們在做哈希(分庫分表)的時候,同時考慮了按照UID哈希和按照時間維度。很業(yè)務(wù)和時間相關(guān)性很高的,今天的熱點新聞,明天就沒熱度了,數(shù)據(jù)的冷熱非常明顯,這種場景就需要按照時間維度做分表,

首先冷熱數(shù)據(jù)做了分離(可以對冷熱數(shù)據(jù)采用不同的存儲方案來降低成本),其次, 很容止控制我數(shù)據(jù)庫表的爆炸。像微博如果只按照用戶維度區(qū)分,那么這個用戶所有數(shù)據(jù)都在一張表里,這張表就是無限增長的,時間長了查詢會越來越慢。

二級索引,是我們里面一個比較特殊的場景,就是我要快速找到這個人所要發(fā)布的某一時段的微博時,通過二級索引快速定位。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計


分布式服務(wù)追蹤系統(tǒng)

分布式追蹤服務(wù)系統(tǒng),當系統(tǒng)到千萬級以后的時候,越來越龐雜,所解決的問題更偏向穩(wěn)定性,性能和監(jiān)控。剛才說用戶只要有一個請求過來,你可以依賴你的服務(wù)RPC1、RPC2,你會發(fā)現(xiàn)RPC2又依賴RPC3、RPC4。分布式服務(wù)的時候一個痛點,就是說一個請求從用戶過來之后,在后臺不同的機器之間不停的調(diào)用并返回。 微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

當你發(fā)現(xiàn)一個問題的時候,這些日志落在不同的機器上,你也不知道問題到底出在哪兒,各個服務(wù)之間互相隔離,互相之間沒有建立關(guān)聯(lián)。所以導(dǎo)致排查問題基本沒有任何手段,就是出了問題沒法兒解決。

我們要解決的問題,我們剛才說日志互相隔離,我們就要把它建立聯(lián)系。建立聯(lián)系我們就有一個請求ID,然后結(jié)合RPC框架, 服務(wù)治理功能。假

設(shè)請求從客戶端過來,其中包含一個ID 101,到服務(wù)A時仍然帶有ID 101,然后調(diào)用RPC1的時候也會標識這是101 ,所以需要一個唯一的請求ID標識遞歸迭代的傳遞到每一個相關(guān)節(jié)點。

第二個,你做的時候,你不能說每個地方都加,對業(yè)務(wù)系統(tǒng)來說需要一個框架來完成這個工作, 這個框架要對業(yè)務(wù)系統(tǒng)是最低侵入原則 , 用 JAVA 的 話 就可以用 AOP,要做到零侵入的原則,就是對所有相關(guān)的中間件打點,從接口層組件(HTTP Client、HTTP Server)至到服務(wù)層組件(RPC Client、RPC Server),還有數(shù)據(jù)訪問中間件的,這樣業(yè)務(wù)系統(tǒng)只需要少量的配置信息就可以實現(xiàn)全鏈路監(jiān)控 。

為什么要用日志?服務(wù)化以后,每個服務(wù)可以用不同的開發(fā)語言, 考慮多種開發(fā)語言的兼容性 , 內(nèi)部定義標準化的日志是唯一且有效的辦法。

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

最后,如何構(gòu)建基于GPS導(dǎo)航的路況監(jiān)控?我們剛才講分布式服務(wù)追蹤。

分布式服務(wù)追蹤能解決的問題, 如果單一用戶發(fā)現(xiàn)問題后 ,可以通過請求 ID 快速找到發(fā)生問題的節(jié)點在什么,但是并沒有解決如何發(fā)現(xiàn)問題。

我們看現(xiàn)實中比較容易理解的道路監(jiān)控,每輛車有GPS定位,我想看北京哪兒擁堵的時候,怎么做?第一個 , 你肯定要知道每個車在什么位置,它走到哪兒了。

其實可以說每個車上只要有一個標識,加上每一次流動的信息,就可以看到每個車流的位置和方向。其次如何做監(jiān)控和報警,我們怎么能了解道路的流量狀況和負載,并及時報警。

我們要定義這條街道多寬多高,單位時間可以通行多少輛車,這就是道路的容量。有了道路容量,再有道路的實時流量,我們就可以基于實習路況做預(yù)警?

對應(yīng)于分布式系統(tǒng)的話如何構(gòu)建?

第一 , 你要定義每個服務(wù)節(jié)點它的 SLA A 是多少 ?SLA可以從系統(tǒng)的CPU占用率、內(nèi)存占用率、磁盤占用率、QPS請求數(shù)等來定義,相當于定義系統(tǒng)的容量。第二個 , 統(tǒng)計線上動態(tài)的流量,你要知道服務(wù)的平均QPS、最低QPS和最大QPS,有了流量和容量,就可以對系統(tǒng)做全面的監(jiān)控和報警。

剛才講的是理論,實際情況肯定比這個復(fù)雜。微博在春節(jié)的時候做許多活動,必須保障系統(tǒng)穩(wěn)定,理論上你只要定義容量和流量就可以。但實際遠遠不行,為什么?有技術(shù)的因素,有人為的因素,因為不同的開發(fā)定義的流量和容量指標有主觀性,很難全局量化標準,所以真正流量來了以后,你預(yù)先評估的系統(tǒng)瓶頸往往不正確。

實際中我們在春節(jié)前主要采取了三個措施:

第一,最簡單的就是有降級的預(yù)案,流量超過系統(tǒng)容量后,先把哪些功能砍掉,需要有明確的優(yōu)先級 。

第二個, 線上全鏈路壓測,就是把現(xiàn)在的流量放大到我們平常流量的五倍甚至十倍(比如下線一半的服務(wù)器,縮容而不是擴容),看看系統(tǒng)瓶頸最先發(fā)生在哪里。我們之前有一些例子,推測系統(tǒng)數(shù)據(jù)庫會先出現(xiàn)瓶頸,但是實測發(fā)現(xiàn)是前端的程序先遇到瓶頸。

第三,搭建在線 Docker 集群 ,所有業(yè)務(wù)共享備用的 Docker集群資源,這樣可以極大的避免每個業(yè)務(wù)都預(yù)留資源,但是實際上流量沒有增長造成的浪費。

總結(jié)

微博千萬級規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計

接下來說的是如何不停的學習和提升,這里以Java語言為例,

首先,一定要 理解 JAVA;

第二步,JAVA完了以后,一定要理解JVM;

其次,還要理解操作系統(tǒng);

再次還是要了解一下DesignPattern,這將告訴你怎么把過去的經(jīng)驗抽象沉淀供將來借鑒;

還要學習 TCP/IP、 分布式系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)和算法。

最后就是我想說的就是今天我所說的可能一切都是錯的!大家通過不停的學習、練習和總結(jié), 形成自己的一套架構(gòu)設(shè)計原則和方法,謝謝大家。


		
		
		
		

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉