Go 構(gòu)建微服務(wù)的歷程在2015年之前,頭條的主要編程語言是 Pyth" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 今日頭條Go建千億級微服務(wù)的實(shí)踐

今日頭條Go建千億級微服務(wù)的實(shí)踐

時間:2022-08-11 15:39:01 | 來源:網(wǎng)站運(yùn)營

時間:2022-08-11 15:39:01 來源:網(wǎng)站運(yùn)營

今日頭條當(dāng)前后端服務(wù)超過80%的流量是跑在 Go 構(gòu)建的服務(wù)上。微服務(wù)數(shù)量超過100個,高峰 QPS 超過700萬,日處理請求量超過3000億,是業(yè)內(nèi)最大規(guī)模的 Go 應(yīng)用。

Go 構(gòu)建微服務(wù)的歷程

在2015年之前,頭條的主要編程語言是 Python 以及部分 C++。隨著業(yè)務(wù)和流量的快速增長,服務(wù)端的壓力越來越大,隨之而來問題頻出。Python 的解釋性語言特性以及其落后的多進(jìn)程服務(wù)模型受到了巨大的挑戰(zhàn)。此外,當(dāng)時的服務(wù)端架構(gòu)是一個典型的單體架構(gòu),耦合嚴(yán)重,部分獨(dú)立功能也急需從單體架構(gòu)中拆出來。

為什么選擇 Go 語言?

Go 語言相對其它語言具有幾點(diǎn)天然的優(yōu)勢:

  1. 語法簡單,上手快

  2. 性能高,編譯快,開發(fā)效率也不低

  3. 原生支持并發(fā),協(xié)程模型是非常優(yōu)秀的服務(wù)端模型,同時也適合網(wǎng)絡(luò)調(diào)用

  4. 部署方便,編譯包小,幾乎無依賴

當(dāng)時 Go 的1.4版本已經(jīng)發(fā)布,我曾在 Go 處于1.1版本的時候,開始使用 Go 語言開發(fā)后端組件,并且使用 Go 構(gòu)建過超大流量的后端服務(wù),因此對 Go 語言本身的穩(wěn)定性比較有信心。再加上頭條后端整體服務(wù)化的架構(gòu)改造,所以決定使用 Go 語言構(gòu)建今日頭條后端的微服務(wù)架構(gòu)。

2015年6月,今日頭條開始使用 Go 語言重構(gòu)后端的 Feed 流服務(wù),期間一邊重構(gòu),一邊迭代現(xiàn)有業(yè)務(wù),同時還進(jìn)行服務(wù)拆分,直到2016年6月,F(xiàn)eed 流后端服務(wù)幾乎全部遷移到 Go。由于期間業(yè)務(wù)增長較快,夾雜服務(wù)拆分,因此沒有橫向?qū)Ρ戎貥?gòu)前后的各項(xiàng)指標(biāo)。但實(shí)際上切換到 Go 語言之后,服務(wù)整體的穩(wěn)定性和性能都大幅提高。

微服務(wù)架構(gòu)

對于復(fù)雜的服務(wù)間調(diào)用,我們抽象出五元組的概念:(From, FromCluster, To, ToCluster, Method)。每一個五元組唯一定義了一類的RPC調(diào)用。以五元組為單元,我們構(gòu)建了一整套微服務(wù)架構(gòu)。

我們使用 Go 語言研發(fā)了內(nèi)部的微服務(wù)框架 kite,協(xié)議上完全兼容 Thrift。以五元組為基礎(chǔ)單元,我們在 kite 框架上集成了服務(wù)注冊和發(fā)現(xiàn),分布式負(fù)載均衡,超時和熔斷管理,服務(wù)降級,Method 級別的指標(biāo)監(jiān)控,分布式調(diào)用鏈追蹤等功能。目前統(tǒng)一使用 kite 框架開發(fā)內(nèi)部 Go 語言的服務(wù),整體架構(gòu)支持無限制水平擴(kuò)展。

關(guān)于 kite 框架和微服務(wù)架構(gòu)實(shí)現(xiàn)細(xì)節(jié)后續(xù)有機(jī)會會專門分享,這里主要分享下我們在使用 Go 構(gòu)建大規(guī)模微服務(wù)架構(gòu)中,Go 語言本身給我們帶來了哪些便利以及實(shí)踐過程中我們?nèi)〉玫慕?jīng)驗(yàn)。內(nèi)容主要包括并發(fā),性能,監(jiān)控以及對Go語言使用的一些體會。

并發(fā)

Go 作為一門新興的編程語言,最大特點(diǎn)就在于它是原生支持并發(fā)的。和傳統(tǒng)基于 OS 線程和進(jìn)程實(shí)現(xiàn)不同,Go 語言的并發(fā)是基于用戶態(tài)的并發(fā),這種并發(fā)方式就變得非常輕量,能夠輕松運(yùn)行幾萬甚至是幾十萬的并發(fā)邏輯。因此使用 Go 開發(fā)的服務(wù)端應(yīng)用采用的就是“協(xié)程模型”,每一個請求由獨(dú)立的協(xié)程處理完成。

比進(jìn)程線程模型高出幾個數(shù)量級的并發(fā)能力,而相對基于事件回調(diào)的服務(wù)端模型,Go 開發(fā)思路更加符合人的邏輯處理思維,因此即使使用 Go 開發(fā)大型的項(xiàng)目,也很容易維護(hù)。

并發(fā)模型

Go 的并發(fā)屬于 CSP 并發(fā)模型的一種實(shí)現(xiàn),CSP 并發(fā)模型的核心概念是:“不要通過共享內(nèi)存來通信,而應(yīng)該通過通信來共享內(nèi)存”。這在 Go 語言中的實(shí)現(xiàn)就是 Goroutine 和 Channel。在1978發(fā)表的 CSP 論文中有一段使用 CSP 思路解決問題的描述。

“Problem: To print in ascending order all primes less than 10000. Use an array of processes, SIEVE, in which each process inputs a prime from its predecessor and prints it. The process then inputs an ascending stream of numbers from its predecessor and passes them on to its successor, suppressing any that are multiples of the original prime.”

要找出10000以內(nèi)所有的素數(shù),這里使用的方法是篩法,即從2開始每找到一個素數(shù)就標(biāo)記所有能被該素數(shù)整除的所有數(shù)。直到?jīng)]有可標(biāo)記的數(shù),剩下的就都是素數(shù)。下面以找出10以內(nèi)所有素數(shù)為例,借用 CSP 方式解決這個問題。

從上圖中可以看出,每一行過濾使用獨(dú)立的并發(fā)處理程序,上下相鄰的并發(fā)處理程序傳遞數(shù)據(jù)實(shí)現(xiàn)通信。通過4個并發(fā)處理程序得出10以內(nèi)的素數(shù)表,對應(yīng)的 Go 實(shí)現(xiàn)代碼如下:


這個例子體現(xiàn)使用 Go 語言開發(fā)的兩個特點(diǎn):

  1. Go 語言的并發(fā)很簡單,并且通過提高并發(fā)可以提高處理效率。

  2. 協(xié)程之間可以通過通信的方式來共享變量。

并發(fā)控制

當(dāng)并發(fā)成為語言的原生特性之后,在實(shí)踐過程中就會頻繁地使用并發(fā)來處理邏輯問題,尤其是涉及到網(wǎng)絡(luò)I/O的過程,例如 RPC 調(diào)用,數(shù)據(jù)庫訪問等。下圖是一個微服務(wù)處理請求的抽象描述:

當(dāng) Request 到達(dá) GW 之后,GW 需要整合下游5個服務(wù)的結(jié)果來響應(yīng)本次的請求,假定對下游5個服務(wù)的調(diào)用不存在互相的數(shù)據(jù)依賴問題。那么這里會同時發(fā)起5個 RPC 請求,然后等待5個請求的返回結(jié)果。為避免長時間的等待,這里會引入等待超時的概念。超時事件發(fā)生后,為了避免資源泄漏,會發(fā)送事件給正在并發(fā)處理的請求。在實(shí)踐過程中,得出兩種抽象的模型。

關(guān)鍵詞:微服,實(shí)踐

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉