今日頭條架構師:頭條1.2億+日活的微服務和高可用架構實踐

運營增長 發佈 2020-03-18T05:27:49+00:00

今日頭條系統,在穩定性可用性方面壓力比較大,一方面需要快速把業務實現,但在另外一方面,類似這些高可用的問題會經常騷擾工程師:上線就掛、運營活動量大服務崩潰、單機性能頂不住、一個小服務上線把核心服務搞掛了…

01

業務高速發展下的架構演進

今日頭條作為國民級資訊閱讀App,2019年用戶規模超6.5億人,日活1.2億+,視頻播放量占頭條整體65%+,頭條號文章發布量超1.6億,視頻發布量超1.5億。

今日頭條系統,在穩定性可用性方面壓力比較大,一方面需要快速把業務實現,但在另外一方面,類似這些高可用的問題會經常騷擾工程師:上線就掛、運營活動量大服務崩潰、單機性能頂不住、一個小服務上線把核心服務搞掛了……類似這些問題,技術團隊需要如何更好的去應對?

架構演進,在不同階段的公司都會面臨各種壓力。小公司壓力可能是業務沒起來,QPS 很低,要做優化也沒有環境及條件。當公司大了,伺服器可能已經不是問題,但你要不斷考慮調優及應對訪問壓力,改善基礎設施以提供更穩定的開發環境。所以說架構演進是持續一個過程,沒有終點。

02

今日頭條架構發展的三個階段

第一階段:傳統的三層架構、單體架構

今日頭條剛開始做的時候,就是一個簡單 Web 應用,搭個資料庫,把業務實現就行了。頭條最開始的優勢是推薦引擎,還有另外一套數據挖掘和離線計算。在線的服務在前端相對來講模式還是比較清晰的,三層就搞定了。業務剛開始起來的時候,沒什麼問題,訪問增大水平擴展一下就可以解決。

第二階段:系統拆分、打散

跟大多數的架構演進歷史非常類似,系統遇到性能瓶頸後,最簡單就做一些拆分。優化的過程中,就是把壓力較大的子系統就從代碼上進行拆分,分成多個可獨立部署、無狀態化的服務。

這個階段可以把SSO、用戶中心、文章中心、視頻、評論等拆分出來,每個業務中心都可以集群部署,達到加機器就可以解決性能問題的效果。

隨著業務的快速發展,代碼和架構上的包袱是比較沉重,改造的成本比較高。基於這些問題,就要開始演進到下一個階段,微服務。

第三階段,微服務,中台化架構

通過拆分成子系統,大的應用拆成小應用,抽象通用層做代碼復用。重點在基礎設施,希望通過基礎設施提高快速疊代、容災和一系列的工作,希望各個業務團隊能更快做業務上的疊代以及架構上的調整。

(微服務架構)


(微服務架構)

微服務最關鍵的三點:

1、解耦,一個服務會依賴另外一個服務、模塊或子服務的概念。

2、輕量,減輕維護人員的成本。

3、易管理。

03

頭條的服務化架構建設思路

立規範。包括部署RPC規範、服務調用規範、服務治理原則、超時重試機制等等,否則規模大了之後就會是個災難。

打基礎。有了規範以後,開始真正落地的服務。比如說基礎庫,把Ngnix、Redis、MySQL這些庫封裝起來,統一起來做一些開發框架,做業務系統開發的時候,就不用關注數據層的細節,專心實現業務邏輯。

漸進。先拆離再疊代,逐步把服務優化起來。

一切都是服務。第四點是和其他公司或團隊稍不一樣的地方,我們的想法是一切都是服務,每個節點都是抽象歸屬於某一個具體的服務。存儲的確是一個服務,但它不只是提供 API 或者提供功能的東西,還需要包括服務質量,需要別人用起來是比較簡單的。

平台化。最後的落地是平台化的東西。我們框架是怎麼設計,和服務怎麼結合?

一切都是服務:

資源是有限的:按需申請,需申請和授權;

簡單的使用方式:開發者只需要關注業務;

有唯一定位的方式:用全局資源定位;

核心規範:

必須要有全局的中心,服務統一註冊到 consul 中;

服務有唯一的標示、命名范:{產品線}.{子系統}.{模塊} P.S.M,公司有很多部門,我們不希望部門之間溝通起來有差異,所以需要有全局規划去追溯它;

業務服務使用 Thrift 描述接口、必須傳遞標準參數。如果用弱的描述數據,沒有強約束,在客戶端的數據可能會出現類型錯誤;

RPC 使用統一收斂的庫;

Nginx、Redis、MC、MySQL、etc 都是服務

服務註冊:我們服務統一使用 loader 或 wrapper 腳本啟動,具體啟動由業務決定。服務啟動會有一個全局唯一ID,把 app 註冊到服務裡面。

服務中心

服務中心有服務信息,會同時帶上是什麼樣的服務,其他人比較簡單的調這個服務就 OK 了。這個服務到底提供什麼樣的服務質量,擁有者可以管理這個信息。Redis去服務,負載均衡,服務一個項目,把服務接上去。

服務關係與授權

服務之間有個關鍵的概念:服務授權。一般我們起一個服務,通過 IP 就可以連上它了。資料庫有用戶名認證,也可以對 IP 授權。不過內網很多服務限制比較少,不是所有服務都有授權認證。我們希望把服務之間的關聯關係,全局拓撲關係記錄下來並且可執行。

04

頭條服務拓撲架構圖

服務依賴和被依賴的全局關係拓撲圖,服務變更影響範圍評估,服務治理,監控預警基礎,需要經常更新維護。

05

頭條RPC開發框架設計思路

建設關鍵點:

1、快速開發,代碼生成

2、服務發現,服務的自動發現、服務註冊

3、可觀測,logid、pprof、admin埠

4、容災降級,業務降級開關

5、過載保護,熔斷器、調用控制

6、多開發語言異構系統

06

基於容器的雲原生微服務

基於容器技術的雲原生微服務,將敏捷開發、devops完美融合,服務化理念的落地與業務場景結合, 實現端到端的價值交付。

以上介紹了今日頭條架構高可用、微服務、容器化等實踐

作者:作者,夏緒宏。今日頭條架構師,專注對高性能大規模 Web 架構,雲計算、性能優化、程式語言理論等方向,PHP committer,HHVM 項目貢獻者。2015 年加入今日頭條負責基礎設施,系統架構設計和優化,解決大流量高並發下的系統性能、可靠性和運維效率等方面的問題。

關鍵字: