中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Stream從Python切換到Go的原因

2018-07-28    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用
Stream最近將其后端核心服務從Python改成了Go。雖然他們的某些模塊仍然在使用Python,但是公司已決定從現(xiàn)在開始使用Go來編寫對性能要求較高的代碼。文中,Stream的CEO兼創(chuàng)始人Thierry Schellenbach將解釋他們決定轉向Go的原因。

影響項目或者產品編程語言選型的因素有很多。與任何技術決策一樣,選擇編程語言時同樣需要多方面權衡,即使這樣,最終的選擇結果都很難是完美的。我們最近將后端的核心服務從Python改成了Go,原因有很多,好處也很多。

為了理解這一變化的重要性,需要先了解我們的產品。Stream是一套用于構建、伸縮、定制化新聞源和活動流的API。每個月為3億多用戶提供約10億次API請求。我們尤其關注性能和可靠性,這兩點因素決定了我們制定的每項技術決策。

 

性能更優(yōu)

 

Go最大的賣點在于它的性能,無論在運行還是編譯時它都有突出的性能優(yōu)勢。它與Java或者C++的運算速度幾乎相當。在實際使用中,我們發(fā)現(xiàn)它比Python大約快30倍。

選擇快速工具對提升系統(tǒng)性能非常重要,因此我們對Cassandra、PostgreSQL、Redis以及其他一些技術進行了優(yōu)化。然而,很多時候我們發(fā)現(xiàn)系統(tǒng)仍然存在瓶頸,而瓶頸正好在于我們的編程語言Python。Python在執(zhí)行序列化、排序和聚合等計算密集型任務時需要花費很長的時間,有時比從網絡上存取和檢索數(shù)據花費的時間更長。我們知道這個時間是可以優(yōu)化的。從Python切換到Go就可以縮短時間,這樣一來,應用程序代碼就更像是服務之間的粘合劑,而不再是優(yōu)化中的主要瓶頸。

用Go編寫的Go編譯器也非?。Stream中最復雜的微服務就采用Go編寫,它的編譯時間僅僅需要6秒,Java和C++等工具鏈則慢得多,快則一分鐘,慢則數(shù)小時。

 

名副其實的簡單

 

 

簡單是Go的重要特征!我敢向你保證,閱讀Go語言的代碼明顯感覺更加簡單。我們已經從多個Python代碼庫中遷移出來,我們發(fā)現(xiàn)這些Python代碼的風格和框架會因為作者的不同而風格各異,往往帶有很多作者個性化的東西。而Go恰恰相反,它推崇干凈的代碼風格,同時要求作者編寫代碼時嚴格遵守規(guī)范,禁止作者“自作聰明”。雖然這樣有時候會使用更加冗長的代碼,犧牲了代碼的簡潔性,但是卻讓代碼更容易閱讀和理解了。這樣一來,Go才得以加快開發(fā)人員閱讀他人代碼的速度,同時,閱讀自己曾經編寫的代碼也更容易。

 

原生并發(fā)性

 

Go在語言層面通過goroutine和channel支持了并發(fā)。此概念源自Tony Hoare的CSP模式,它讓程序員處理并發(fā)變得不再困難。

goroutine類似于操作系統(tǒng)的線程,但其運行消耗的系統(tǒng)資源更小,每個goroutine僅需幾KB的堆?臻g。Go運行時可以在操作系統(tǒng)線程之上處理多路goroutine。雖然在后臺執(zhí)行,但它對于程序員來說是可見的。單個程序擁有數(shù)千個goroutine也并不罕見。比如,net/http軟件包中的服務器程序針對每個HTTP請求都會創(chuàng)建一個goroutine。

在Go中啟動goroutine非常簡單,只需通過go關鍵字添加一個函數(shù)調用,即可啟動一個goroutine,并讓該函數(shù)運行在自己的goroutine中。

Go有一句重要的格言,即:不要通過共享內存來通信,相反,通過通信來共享內存 。Goroutine之間通過channel進行通信,channel的使用方法與goroutine一樣簡單。Channel擁有類型,可以通過直觀的箭頭語法輕松實現(xiàn)goroutine之間的數(shù)據傳遞。盡管channel使用簡單,但是其功能非常強大。在設計時只要預先稍作考慮,與傳統(tǒng)的系統(tǒng)相比,使用Go便能夠輕而易舉地開發(fā)大規(guī)模并發(fā)系統(tǒng)。

使用簡單的并發(fā)工具可以解決那些經常導致錯誤的問題。Go內置了競態(tài)條件檢測器,可以更輕松地檢測異步代碼中的競爭狀態(tài)。

 

語言生態(tài)

 

跟C++和Java這樣已經高度普及的傳統(tǒng)語言相比,Go仍然是編譯語言領域的新手。雖然目前大約只有5%的程序員知道Go,但是得益于它的易用性,這個數(shù)字在不斷增長。雖然Go語言速度快且功能強,但它只有25個保留字。相比于C++的92個保留字,以及Java的53個保留字,Go顯得非常簡潔。過多的保留字會增加程序員的學習成本。

由于Go上手非常容易,因此組建Go開發(fā)團隊相比其他語言來說更容易。Go初學者可以很快入門并精通該語言。這使得雇主甚至可以招聘其他背景的開發(fā)人員,然后加以短期培訓即可使其成為合格的Go工程師。

Go提供的內置庫開箱即用且功能強大。使用“net/http”僅需幾行代碼即可實現(xiàn)HTTP服務器,并且還支持http/2、TLS和websocket。Go社區(qū)軟件包的生態(tài)系統(tǒng)也很出色,已經出現(xiàn)了很多與Redis、RabbitMQ、PostgreSQL、模板以及RocksDB相關的庫,它們運行穩(wěn)定且更新頻繁。

 

其他優(yōu)勢

 

在前文中我提到了Go并不鼓勵程序員“自作聰明”,它并沒有提供可能會節(jié)省時間的功能,比如可嵌套的三元運算符。

Go采用另一種方式來節(jié)省時間,它既沒有選擇制表符也沒有選擇空格,而是轉而使用了gofmt。它是一種命令行工具,可與大多數(shù)編輯器集成并自動將代碼格式化為特定的格式。即使格式不正確代碼仍會編譯,但是拉取請求會被忽略,除非代碼通過gofmt并且能夠保持整個代碼庫格式一致。這使得代碼評審人員能夠專注在代碼上,而不必在格式上浪費時間。

Go有助于開發(fā)微服務。谷歌的protobuf和gRPC是微服務間通信的基礎,Go對它們提供了很好的支持。作為開發(fā)人員,我們只需在清單文件中定義一項服務,工具便會自動生成客戶端和服務器端代碼,并且保證代碼的高性能以及很低的網絡負載。此外,清單文件還可以被其他語言用來生成他們自己的客戶端和服務器端代碼。所以,如果我們決定用其他技術來替代部分架構,之后的任務會更加簡單。

 

Python vs. Go

 

Stream服務強大功能之一是feed排名。feed排名允許我們的用戶為feed指定一個評分函數(shù),以便控制排序方式。評分算法可以提供很多變量來確定排名,其中基于流行度的一個例子可能是這樣的:

 
{ 
"functions":{ 
"simple_gauss":{ 
"base":"decay_gauss", 
"scale":"5d", 
"offset":"1d", 
"decay":"0.3" 
}, 
"popularity_gauss":{ 
"base":"decay_gauss", 
"scale":"100", 
"offset":"5", 
"decay":"0.5" 
} 
}, 
"defaults": { 
"popularity": 1 
}, 
"score":"simple_gauss(time)*popularity" 
}
  1. 為了支持這種排名方法,Python和Go代碼都需要解析表達式計算得分。在這種情況下,我們需要將字符串 “ simple_gauss(time)* popular ” 變成一個函數(shù),它將活動數(shù)據作為輸入,并輸出分數(shù)。
  2. 基于JSON配置創(chuàng)建部分功能。例如,我們希望“simple_gauss”以五天的時間窗、一天的偏移量以及0.3的衰減因子來調用“decay_gauss”。
  3. 解析“默認”配置,以便在活動數(shù)據中發(fā)現(xiàn)未定義的字段時進行回退。
  4. 使用步驟1中的功能對feed中的所有活動數(shù)據進行評分。

開發(fā)Python版本的排名代碼需要花費大約三天時間,包括編寫代碼、單元測試和編寫文檔。接下來,團隊需要大約兩周的時間來優(yōu)化代碼。其中一項優(yōu)化是將分數(shù)表達式 (simple_gauss(time)* popular )轉換為抽象語法樹。該團隊還實施了高速緩存邏輯,預先計算了將來某些時間的分數(shù)。

相比之下,開發(fā)這些代碼的Go版本大約花費了四天時間,并且不需要再對其性能實施進一步的優(yōu)化。雖然Python用來開發(fā)初期版本更快,但是整體來說使用Go開發(fā)的工作量要小得多。

Go的語言特性使得在優(yōu)化代碼時能夠節(jié)省大量的時間。使用Python時,我們不得不將表達式解析為抽象語法樹,并優(yōu)化和剖析每一個函數(shù)。由于Go比Python快得多,因此我們不需要花太多精力優(yōu)化代碼。最終的結果是,Go代碼的執(zhí)行速度比精心優(yōu)化的Python代碼大約快40倍。

用Go來構建Stream系統(tǒng)中的某些組件相比用Python花費了更多的時間?傮w來說,開發(fā)Go代碼要花費更多的精力,但團隊用來優(yōu)化代碼性能的時間則更少。

 

結論

 

Go非常適用于開發(fā)微服務。它的速度非常快,具有原生并發(fā)原語,完美支持多種現(xiàn)有工具,并且開發(fā)起來樂趣無窮。與Ruby或Python等腳本語言相比,編寫Go代碼可能需要更長的時間,但其維護成本要低得多,加之其代碼無需太多優(yōu)化,因此你可以節(jié)省大量的時間。

需要注意的是,對于某些適合使用Python開發(fā)的模塊,Stream仍然使用Python。例如,我們的儀表板、網站以及用于個性化訂閱的機器學習都使用Python實現(xiàn),因為Python提供的這些工具更好用。我們不會馬上完全棄用Python,但是對于性能要求較高的代碼,我們今后會使用Go來編寫。

原文鏈接:https://jaxenter.com/stream-switch-go-142279.html

標簽: http服務器 代碼 服務器 服務器端 谷歌 腳本 排名 通信 網絡

版權申明:本站文章部分自網絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:2018最具創(chuàng)新力的大數(shù)據解決方案排行榜

下一篇:AI入門者必看——人工智能技術人才成長路線圖