當前位置:
首頁 > 知識 > 換掉Python!那個還不錯的Stream公司上了GO語言的船!

換掉Python!那個還不錯的Stream公司上了GO語言的船!

Stream公司最近將其核心服務的後端從Python切換成了Go,雖然他們內部還在使用Python,但是公司已經決定從現在開始在Go中編寫所有性能密集型代碼。本文,Stream首席執行官和創始人Thierry Schellenbach解釋了公司的這一決定。

選擇項目或產品的編程語言會受到許多因素驅動,與所有技術決策一樣,沒有完美的答案足以解決所有問題。Stream之所以這麼做,是因為感受到了Go語言的巨大好處。

這與Stream的產品有關。Stream是用於構建,縮放、個性化新聞源和活動流的API。每月為3億多用戶提供約10億次API請求。因此,性能和可靠性Stream制定每項技術決策的最重要原因

換掉Python!那個還不錯的Stream公司上了GO語言的船!

Python和GO:性能對比!

Go最大的賣點可能就是性能,無論是運行時間還是編譯時間。它在大多數計算基準測試中與Java或C ++相當。在Stream的實際使用中,GO比Python快大約30倍

選擇性能優秀的工具非常重要(Stream已經優化了Cassandra,PostgreSQL,Redis和許多其他技術)。然而,有時發現系統中的瓶頸確實是Python引起的,像序列化,排序和聚合等計算繁重的任務有時會比從網路數據存儲檢索數據花費更長的時間。

Go編譯器(本身是用Go編寫的)也非常快。使用Go編寫的Stream中最複雜的微服務只需要6秒即可編譯完成,與Java和C ++等工具鏈相比,這是一個重大勝利。

此外,閱讀Go語言代碼往往非常簡單,GO乾淨的風格讓讀取和推理更容易。

換掉Python!那個還不錯的Stream公司上了GO語言的船!

本地並發

通過goroutines和channel將並發性融入到語言中。Goroutines在概念上類似於操作系統線程,但非常便宜——每個成本只有幾KB的堆棧空間。Go運行時可以處理智能多路復用goroutines,這一切對程序員來說是透明的。單個程序擁有數千個goroutines並不罕見。例如,net / http軟體包中的伺服器為每個傳入的HTTP請求創建一個goroutine。

在真正的Go語言中,goroutine非常簡單:只需在「go」關鍵字前添加一個函數調用,讓它運行在自己的goroutine中即可。

Go世界的傳統觀點是「不通過共享內存來交流,相反的是,通過通信來共享內存「。在goroutines之間進行通信的原語是channel,它們與goroutines一樣易於使用。channel有一個類型,可以通過直觀的箭頭語法輕鬆地在goroutine之間傳遞數據。雖然簡單,但channel非常強大。通過預先考慮,與傳統系統相比,製作大規模並發系統是一件輕而易舉的事情。

使用簡單的並發工具,可以解決那些經常導致錯誤的複雜問題。Go隨附內置競速檢測器,可以更輕鬆檢測非同步代碼中的競爭狀態。

生態系統

Go仍然是編譯語言環境的新手,遠比不上C ++和Java等傳統語言的普及程度。雖然只有大約5%的程序員知道Go,但是這個數字還在不斷增長,而且這種增長是由於語言的易用性所致。雖然語言快速且功能強大,但該語言只有25個保留字(與C ++ 92或Java 53相比),對於大多數開發人員來說,它只會引入很少的新概念。

換掉Python!那個還不錯的Stream公司上了GO語言的船!

建立一個Go開發團隊比大多數語言更容易,因為它更容易學習。

隨Go提供的內置庫在開箱即用,功能強大。使用`net / http`包製作HTTP服務只需要幾行代碼,並且本地支持http / 2,TLS和websocket等。社區軟體包的生態系統也很出色,適用於Redis,RabbitMQ,PostgreSQL和RocksDB等。

其他福利

Go節省時間的另一種方式是使用Gofmt。它是一個命令行工具,可與大多數編輯器集成並自動將代碼格式化為事實標準。如果格式不正確,代碼仍會編譯,但除非通過gofmt運行代碼以保持整個代碼庫格式一致,否則將不會查看pull請求。這使代碼審查人員能夠專註於代碼而不是花時間挑剔格式。

Go有助於開發微服務架構,gRPC和Google的協議緩衝區是管理微服務之間通信的好方法,Go有一流的支持。

Python與Go

Stream服務中的一個強大功能是排名提要。排名提要允許用戶為提要指定一個評分函數,以便控制提取時的排序方式。評分演算法可以提供很多變數來確定排名,但基於流行度的一個很好的例子可能是這樣的:

換掉Python!那個還不錯的Stream公司上了GO語言的船!

1.要支持這種排名方法,Python和Go代碼都需要:

解析分數的表達式。在這種情況下,我們想將字元串「simple_gauss(time)* popular」變成一個函數,它將一個活動作為輸入並返回一個分數作為輸出。

2.根據JSON配置創建部分函數。例如,我們希望「simple_gauss」以五天的刻度,一天的偏移量和0.3的衰減因子來調用「decay_gauss」。

3.如果在活動中沒有定義某個欄位,則應對「默認值」配置進行壓縮,以便進行回退。

4.使用步驟1中的功能對Feed中的所有活動進行評分。

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

相比之下,開發此代碼的Go版本需要大約四天的時間,並且性能不需要任何進一步的優化。 雖然Python的開發初期看來更快,但Go版本最終需要的工作量大大減少。

在優化代碼庫時節省的時間歸功於Go語言的特點。使用Python,程序員不得不將表達式解析為抽象語法樹,並優化/剖析通過排名公開的每個函數。

結論

Go是編寫微服務的偉大語言。它的速度非常快,具有原生並發原語,對現有工具的卓越支持,並且開發起來非常有趣。與Ruby或Python等腳本語言相比,Go語言可能需要更長的時間,但維護成本要低得多而且將節省大量時間優化代碼。

重要的是,Stream仍然在使用Python,它是有意義的。例如,儀錶板,網站和個性化訂閱源的機器學習使用Python,因為工具更好。Stream不會馬上告別Python,但是今後會在Go中編寫所有性能密集型代碼。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT168企業級 的精彩文章:

盤點幾位史詩級黑帽黑客:這群人到底厲害到什麼程度?
深諳企業組網之道 新華三MSG360-10-PWR多業務網關評測

TAG:IT168企業級 |