知乎從Python轉爲Go,是否是表明Go比Python好?

衆所周知,知乎早在幾年前就將推薦系統從 Python 轉爲了 Go。因而乎,一部分人就說 Go 比 Python 好,Go 和 Python 兩大社區的相關開發人員爲此也爭論過很多,彷佛,誰也沒徹底說服誰。前端


知乎從Python轉爲Go,是否是表明Go比Python好?我認爲,各有優勢,誰也取代不了誰,會長期共存!編程


「由 Python 語言轉向 Go 語言就說明 Go 語言比 Python 語言好」徹底是一種片面理解。後端


「語言至上論」是解決不了業務問題的,選 Go 也不行,Java 也不行。安全


Go 的優點是文件易部署,協程機制相對成熟且簡單,以及靜態編譯語言的效率,還有就是編程模式相對簡單。這大概是如今愈來愈多企業嘗試Go的緣由,除了知乎,B 站也把核心部件從 PHP 轉到了Go。服務器


除此以外,BAT 等互聯網巨頭,內部都有系統採用了 Go 語言。
微信


那是否是說 Python、PHP 不行了?固然不是也不該該是這樣的。若是要堅持Python、PHP,也是沒問題。一個系統沉積過久的話,會產生不少大大小小、零零散散的「技術債」,這其間就涉及解決成本的考量,重構、重寫、抑或從新設計核心模塊或新模塊?由此又帶來技術選擇的問題。還有Python、PHP人才儲備的問題,還有團隊但願嘗試新技術的考慮。這些問題交織在一塊兒,就不是哪一個編程語言好跟壞這麼簡單的事兒了。因此仍是要回到業務層面來看技術解決之道。架構


不得不說,Go的協程,一個「go」就能解決絕大多數問題,確實寫代碼很簡潔,Python 新添的 asyncio 仍是相對複雜,Future、Task等等仍是有很多門道的。因此,技術永遠只有合適的,而沒有最佳的,也沒有非此即彼的好壞分明。併發


我相信,若是團隊在 Python 方面積累厚實,且熱衷專一於 Python,選擇Python 應該就是個大機率事件。Python 如今已經應用頗廣,特別是在 AI 領域帶動下,Python 人才也不像之前那樣難找工做了,鐵打的營盤流水的兵,是否是知乎也面臨人才流動壓力?此外,畢竟 Python 的生態,在這麼多編程語言中,是首屈一指的,Go 雖熱,但在社區方面恐怕仍是比不上 Python、PHP,這也是一個現實問題。知乎前端換了 React,我沒感受比原來的 AngularJS 進步,但不能就此說 React 不行。嘗試用 Go 寫一些原來 Python 的範圍,也是同理。並且一個系統同時應用多種開發語言、一系列技術棧,都是再正常不過的事了。app


Python 有本身的場景,不會被完全替換的,擔憂也是多慮的,反正都是「增刪改查」嘛!async


至於,知乎爲何選擇 Go,內部的一些工程師透露:選擇 Go 並非一我的的決定,而是整個團隊深思熟慮後的結果!


衆所周知,知乎社區後端的主力編程語言是 Python。


隨着知乎用戶的迅速增加和業務複雜度的持續增長,核心業務的流量在過去一年內增加了好幾倍,對應的服務端的壓力也愈來愈大。隨着業務發展,咱們發現 Python 做爲動態解釋型語言,較低的運行效率和較高的後期維護成本帶來的問題逐漸暴露出來:


  1. 運行效率較低。知乎目前機房機櫃空間已經不足,按照目前的用戶和流量增加速度,可預見將在短時間內服務器資源告急(針對這一點,知乎正在由單機房架構升級爲異地多活架構);

  2. Python 過於靈活的語言特性,致使多人協做和項目維護成本較高


受益於近些年開源社區的發展和容器等關鍵技術的普及,知乎的基礎平臺技術選型一直較爲開放。在開放的標準之上,各個語言都有成熟的開源的中間件可供選擇。這使得業務作選型時能夠根據問題場景選擇更合適的工具,語言也是同樣。


基於此,爲了解決資源佔用問題和動態語言的維護成本問題,咱們決定嘗試使用靜態語言對資源佔用極高的核心業務進行重構。


爲何選擇 Golang?


如上所述,知乎在後端技術選型上比較開放。在過去幾年裏,除了 Python 做爲主力語言開發,知乎內部也不乏 Java、Golang、NodeJS 和 Rust 等語言開發的項目。


Golang 是當時知乎內部討論交流最活躍的編程語言之一,考慮到如下幾點,知乎決定嘗試用 Golang 重構內部高併發量的核心業務:


  1. 自然的併發優點,特別適合 IO 密集應用

  2. 知乎內部基礎組件的 Golang 版生態比較完善

  3. 靜態類型,多人協做開發和維護更加安全可靠

  4. 構建好後只需一個可執行文件便可,方便部署

  5. 學習成本低,且開發效率較 Python 沒有明顯降


相比另外一門也很優秀的待選語言—— Java,Golang 在知乎內部生態環境、部署的方便程度和工程師的興趣上都更勝一籌,最終咱們決定,選擇 Golang 做爲開發語言。


最後,咱們作個簡單總結:第一點,重構語言的選擇,關鍵要跟公司技術背景和業務場景結合起來第二點,架構儘可能靈活,並不斷自我迭代;第三點,監控要早點開展,並儘量底層化、通用化。

本文分享自微信公衆號 - 業餘草(yyucao)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索