標籤:badge set 能力 tip params nan nav block 比較
使用 Go語言開發的比較成功的軟體有哪些?
國內有哪些公司正在使用 Go,有什麼指導意見嗎?8 條評論 分享 預設排序按時間排序49 個回答514贊同反對,不會顯示你的姓名RioPython話題優秀回答者 VC/播客主播/前知乎工程師收錄於 編輯精選 ?514 人贊同知乎大部分項目是 Python 寫的,有幾個小項目是用 Go 寫的。我從一個 Python 為主的開發人員的角度說說對 Go 的優點的體會吧:
- 部署簡單。Go 編譯產生的是一個靜態可執行檔,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需的各種包、庫的依賴關係,大大減輕了維護的負擔。這和 Python 有著巨大的區別。由於曆史的原因,Python 的部署工具生態相當混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及相容性問題】。官方 PyPI 源又經常出問題,需要搭建私人鏡像,而維護這個鏡像又要花費不少時間和精力。
- 並發性好。Goroutine 和 channel 使得編寫高並發的服務端軟體變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應用也能有效利用多個 CPU 核,並存執行的效能好。這和 Python 也是天壤之比。多線程和多進程的服務端程式編寫起來並不簡單,而且由於全域鎖 GIL 的原因,多線程的 Python 程式並不能有效利用多核,只能用多進程的方式部署;如果用標準庫裡的 multiprocessing 包又會對監控和管理造成不少的挑戰【我們用的 supervisor 管理進程,對 fork 支援不好】。部署 Python 應用的時候通常是每個 CPU 核部署一個應用,這會造成不少資源的浪費,比如假設某個 Python 應用啟動後需要佔用 100MB 記憶體,而伺服器有 32 個 CPU 核,那麼留一個核給系統、運行 31 個應用副本就要浪費 3GB 的記憶體資源。
- 良好的語言設計。從學術的角度講 Go 語言其實非常平庸,不支援許多進階的語言特性;但從工程的角度講,Go 的設計是非常優秀的:規範足夠簡單靈活,有其他語言基礎的程式員都能迅速上手。更重要的是 Go 內建完善的工具鏈,大大提高了團隊協作的一致性。比如 gofmt 自動排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動運行 gofmt,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼。此外還有 gofix, govet 等非常有用的工具。
- 執行效能好。雖然不如 C 和 Java,但通常比原生 Python 應用還是高一個數量級的,適合編寫一些瓶頸業務。記憶體佔用也非常省。
編輯於 2013-08-01 66 條評論 感謝 分享 收藏 ? 沒有協助 ? 舉報 ? 申請轉載192贊同反對,不會顯示你的姓名知乎使用者 其實我是浮南人192 人贊同
背景
在接觸Golang以前,我用C/C++、Lua及Python作為主要開發語言。
C/C++的問題:
- 開發效率低,對開發人員要求高
- libc只向後相容,營運難度偏大
Lua/Python的問題:
- 動態語言,缺少編譯過程,低級錯誤頻出
- 缺少有效效能分析及調試工具
情境
當時剛完成了nginx WAF模組的開發工作,便開始著手搭建WAF的後台管理系統。 由於之前同事都用的fluentd作為日誌收集組件,為保持基礎組件的一致性,我也選擇了fluentd。 即最終架構為fluentd->mongodb->mysql,再基於mysql做前端資料展示。 後來被坑了許多次,就決定用Go重寫fluentd以解決下面幾個問題:
- fluentd在ubuntu 9.04偶爾會出現假死,導致資料丟失
- fluentd難以接入公司現有的包發布系統,導致營運難度極大
- mongodb採用mmap實現,資料量大時佔用記憶體過高
方案
- gofluent的代碼 請點擊這裡
- httpmq的代碼 請點擊這裡
事實上,這兩個項目都是為瞭解決上面提到的問題。 說起來也許你不信,這兩個套代碼是我在業餘時間完成的,也就是說這根本不算在KPI之內。 其實一開始我也沒想到能夠這麼快就寫得七七八八,畢竟是現學現用啊。 但實際情況就是,我花了一周時間寫完httpmq,一個月多時間就寫好了gofluent……當然,這兩個項目還有很多不完善的地方。目前就日誌收集方案來說,我更推薦elastic/logstash-forwarder · GitHub和elastic/logstash · GitHub配合使用。
為什麼選擇Golang
那麼,為什麼我會選擇Golang呢?其實我在做出這個選擇之前已經花了大量時間做過詳盡調研。 國外如Google、AWS、Cloudflare、CoreOS等,國內如七牛、阿里等都已經開始大規模使用Golang開發其雲端運算相關產品。 跟著世界級巨人的腳步應該不至於走錯方向,而且在學習Golang的過程中,我也漸漸被其背後的設計哲學所折服。
另外,雲風部落格中曾說過這樣一句話:
我發現我花了四年時間錘鍊自己用 C 語言構建系統的能力,試圖找到一個規範,可以更好的編寫軟體。結果發現只是對 Go 的模仿。缺乏語言層面的支援,只能是一個拙劣的模仿。
以下則是我對Golang的淺薄理解:
- 有C基礎,學Golang非常輕鬆
- 同步方式輕鬆實現高並發
- 代碼簡潔,格式統一,閱讀方便
- 效能強勁的同時,開發效率又不差於Python等動態語言
效果
最開始準備上線的時候其實心裡挺忐忑,畢竟一旦出現故障,不僅黑鍋得自己背,面子也上過不去啊。 還好結果蠻漂亮,自上線後沒出現過一次突發性BUG,降低營運難度的同時還減少了機器的負載。
總而言之,從工程的角度上來看,對於大多數後台應用情境,選擇Golang是極為明智的選擇。 這樣可以很輕鬆的兼顧運行效能、開發效率及維護難度這三大讓諸多程式猿欲仙欲死的奇點。
為什麼要使用 Go 語言?Go 語言的優勢在哪裡?