b站為何選擇Go語言重構(gòu)后臺代碼
從一位曾經(jīng)在嗶哩嗶哩任職的開發(fā)人員那里费就,了解了一下B站的技術(shù)發(fā)展歷程:最開始是用PHP語言開發(fā)的叨吮,后來B站的中臺逐步被Node占領(lǐng),而后臺技術(shù)為了更高的并發(fā)、更穩(wěn)健智厌,以及為了大數(shù)據(jù)分析妻坝,逐步向JAVA靠攏惊窖,這便導(dǎo)致了嗶哩嗶哩的技術(shù)整體較為混亂刽宪。
B站早期幾乎天天故障界酒,隨著團隊和業(yè)務(wù)擴大圣拄,各方面的壓力都增加,處處冒火毁欣。代碼混亂,框架結(jié)構(gòu)混亂凭疮,已經(jīng)到了難以維護的地步,需要理清脈絡(luò)执解,在這樣的情況下統(tǒng)一技術(shù)棧是毫無疑問該做的事寞肖。最后發(fā)現(xiàn)重寫反而是最優(yōu)的解決方案。
為什么是Go材鹦?
歸根到底逝淹,重寫后臺工程是嗶哩嗶哩統(tǒng)一技術(shù)棧的一次嘗試桶唐,至于最后為啥選擇了Go,很重要的一點在于Go能夠滿足嗶哩嗶哩平臺重構(gòu)優(yōu)化的需求欣簇;另一點是其研發(fā)總監(jiān)毛劍本身是一位Go語言的忠實布道者。
那我們站在嗶哩嗶哩的角度來分析以下:
第一:Go內(nèi)置的net/http包基本上把我們平常用到的網(wǎng)絡(luò)功能都實現(xiàn)了熊咽,這些特性對于網(wǎng)絡(luò)視頻平臺嗶哩嗶哩來講闹丐,解決其當(dāng)前所面臨的問題是綽綽有余的横殴。
第二:公司有自己的Go語言團隊
嗶哩嗶哩的研發(fā)總監(jiān)毛劍,此前的工作經(jīng)歷均以Go為主梨与,同時他也帶了自己的Go團隊共同加入文狱,在這樣的背景下,相對于JAVA瞄崇、Python,選擇用Go來重構(gòu)后臺顯然能夠起到事半功倍的效果苏研。
所以嗶哩嗶哩采用Go語言來重寫后臺JAVA工程,有行業(yè)發(fā)展的必然性凿掂,也有場景纹蝴、功能實現(xiàn)的需求性,還有技術(shù)負責(zé)人根據(jù)現(xiàn)實情形做出選擇的主觀判斷性塘安。隨著行業(yè)的不斷發(fā)展,各種新興語言不斷出現(xiàn)兼犯,一個項目中多種語言并存忍捡、互補的現(xiàn)象是必然的,也許幾十年后你還會發(fā)現(xiàn)用Go寫的后臺被其他語言改寫了切黔,或者某種你以為已經(jīng)成為歷史的語言卷土重來也不是沒有可能。
而從今天bilibili泄露出來的Go的源代碼我們也可以看到凌埂,對于bilibili這樣日以幾千萬的訪問量诗芜,Go語言實現(xiàn)高并發(fā)還是非常靠譜的伏恐。
參考?https://juejin.im/entry/59dae7155188252e7547a569
Go語言的特點
1、學(xué)習(xí)曲線容易
Go語言語法簡單横蜒,包含了類C語法。在國內(nèi)大家都追求快 越快越好丛晌,因為Go語言容易學(xué)習(xí),學(xué)習(xí)曲線很低,又很容易上手孟岛,這也導(dǎo)致了Go在墻內(nèi)比墻外先開花的原因之一。
2斤贰、效率:快速的編譯時間次询,開發(fā)效率和運行效率高
開發(fā)過程中相較于 Java 和 C++呆滯的編譯速度,Go 的快速編譯時間是一個主要的效率優(yōu)勢屯吊。Go擁有接近C的運行效率和接近PHP的開發(fā)效率。
3骗爆、強大的標(biāo)準庫
這包括互聯(lián)網(wǎng)應(yīng)用蔽介、系統(tǒng)編程和網(wǎng)絡(luò)編程。Go里面的標(biāo)準庫基本上已經(jīng)是非常穩(wěn)定了虹蓄,特別是我這里提到的三個,網(wǎng)絡(luò)層外臂、系統(tǒng)層的庫非常實用体箕。?Go 語言的 lib 庫麻雀雖小五臟俱全。?Go 語言的 lib 庫中基本上有絕大多數(shù)常用的庫累铅,雖然有些庫還不是很好,但我覺得不是問題菇民,因為我相信在未來的發(fā)展中會把這些問題解決掉。
4第练、部署方便:二進制文件,Copy部署
這一點是很多人選擇Go的最大理由呕寝,因為部署太方便了婴梧,所以現(xiàn)在也有很多人用Go開發(fā)運維程序。
5塞蹭、簡單的并發(fā)
并行和異步編程幾乎無痛點。Go 語言的 Goroutine 和 Channel 這兩個神器簡直就是并發(fā)和異步編程的巨大福音岗屏。像 C漱办、C++、Java娩井、Python 和 JavaScript 這些語言的并發(fā)和異步方式太控制就比較復(fù)雜了,而且容易出錯率碾,而 Go 解決這個問題非常地優(yōu)雅和流暢屋彪。這對于編程多年受盡并發(fā)和異步折磨的編程者來說,完全就是讓人眼前一亮的感覺畜挥。Go 是一種非常高效的語言,高度支持并發(fā)性躯泰。Go是為大數(shù)據(jù)华糖、微服務(wù)、并發(fā)而生的一種編程語言客叉。
前面只是從技術(shù)的角度分析go 語言的優(yōu)勢话告,但是技術(shù)只是一個方面卵慰,一個語言真正能不能發(fā)展起來,是否適合公司的業(yè)務(wù)病线,對于公司業(yè)務(wù)是否原因用go去代替其他語言,關(guān)鍵還要看這幾點鲤嫡。
有沒有一個比較好的社區(qū)。?像 C、C++紊撕、Java、Python 和 JavaScript 的生態(tài)圈都是非常豐富和火爆的区赵。尤其是有很多商業(yè)機構(gòu)參與的社區(qū)那就更為人氣爆棚了浪南,比如 Linux 的社區(qū)。
有沒有一個工業(yè)化的標(biāo)準络凿。?像 C、C++絮记、Java 都是有標(biāo)準化組織的。尤其是 Java派敷,其在架構(gòu)上還搞出了像 J2EE 這樣的企業(yè)級標(biāo)準撰洗。
有沒有一個或多個殺手級應(yīng)用。?C试躏、C++ 和 Java 的殺手級應(yīng)用不用多說了设褐,就算是對于 PHP 這樣還不能算是一個好的編程語言來說埠对,因為是 Linux 時代的第一個殺手級解決方案 LAMP 中的關(guān)鍵技術(shù)裁替,所以,也發(fā)展起來了弱判。
上述的這三點是非常關(guān)鍵的,新的技術(shù)只需要占到其中一到兩點就已經(jīng)很不錯了开伏,何況有的技術(shù)遭商,比如 Java,是三點全占到了劫流,所以,Java 的發(fā)展是如此好仍秤。當(dāng)然可很,除了上面這三點重要的,還有一些其它的影響因素我抠,比如:
學(xué)習(xí)曲線是否低,上手是否快圈澈。?這點非常重要尘惧,C++ 在這點上越做越不好了。
有沒有一個不錯的提高開發(fā)效率的開發(fā)框架喷橙。?如:Java 的 Spring 框架,C++ 的 STL 等悬荣。
是否有一個或多個巨型的技術(shù)公司作為后盾疙剑。?如:Java 和 Linux 后面的 IBM践叠、Sun……
有沒有解決軟件開發(fā)中的痛點嚼蚀。?如:Java 解決了 C 和 C++ 的內(nèi)存管理問題。
是否有幾個殺手級別的應(yīng)用轿曙。如很多大公司都是用Java代替原來的c# ,這也是Java最流行的原因之一
當(dāng)然守谓,我個人覺得您单,Go 可能會吞食很多 C、C++虐秦、Java 的項目。不過,Go 語言所吞食主要的項目應(yīng)該是中間層的項目别洪,既不是非常底層也不會是業(yè)務(wù)層。
也就是說挖垛,Go 語言不會吞食底層到 C 和 C++ 那個級別的,也不會吞食到高層如 Java 業(yè)務(wù)層的項目送矩。Go 語言能吞食的一定是 PaaS 上的項目哪替,比如一些消息緩存中間件、服務(wù)發(fā)現(xiàn)凭舶、服務(wù)代理、控制系統(tǒng)匆背、Agent身冀、日志收集等等括享,沒有復(fù)雜的業(yè)務(wù)場景珍促,也到不了特別底層(如操作系統(tǒng))的中間平臺層的軟件項目或工具。而 C 和 C++ 會被打到更底層踢星,Java 會被打到更上層的業(yè)務(wù)層。