Dropbox公司的Go語言探索之路

jopen 7年前發布 | 18K 次閱讀 Dropbox

Dropbox公司的Go語言探索之路

Tammy 援引 Rob Pike 于 2012 年撰寫的《谷歌Go 語言:專為軟件工程服務設計的編程語言》中的說法,解釋了 Go 語言為何能夠在 Dropbox 公司當中發揮重要作用:

“Go 語言高效、可擴展且極具生產能力。一部分程序員樂于加以運用,但也有一些人認為其難以理解甚至非常無聊。在這篇文章中,我們將解釋為什么這些立場本身并不矛盾。Go 語言旨在幫助谷歌公司解決其在軟件開發方面面臨的各類問題,這意味著其盡管不能算是一種突破性的研究型語言,但仍然成為大型軟件工程項目當中的出色工具。” — Rob Pike, 2012

Dropbox 公司擁有龐大的業務規模:

  • 超過 5 億名用戶;
  • 20 萬商業客戶;
  • 500 PB 用戶數據;
  • 數據 EB GO 存儲系統。

正因為如此,Dropbox 公司對自身系統、語言以及工程師提出了極高要求。其指導原則與要求包括:

  •  構建高可靠性系統;
  • 構建安全系統;
  • 將可靠性與安全性納入初始設計;
  • 可靠性需要達到 99.9999999999% (12 個9);
  • 可用性需要達到 99.99%。

Dropbox 公司對 Go 語言的應用

目前,Dropbox 公司的大部分基礎設施以 Go 語言編寫而成,具體包括:

  • Go 服務器庫擁有 150 名貢獻者(來自總計 500 名工程師);
  • Dropbox 公司內超過 15 個團隊負責構建及運行 Go 服務;
  • Dropbox 公司內部擁有 130 萬行 Go 代碼;

另有一部分關鍵性系統亦由 Go 語言編寫而成:

  • RAT: 限速與限流工具。
  • HAT: memcached 的替代方案。
  • AFS: 一套用于替代全局 Zookeeper 的文件系統。
  • Edgestore: 分布式數據庫。
  • Bolt: 用于消息收發。
  • DBmanager: 用于對 Dropbox 內超過 6000 套數據庫進行自動化管理與監控。
  • “Jetstream”、“Telescope” 、分塊路由以及更多……

其中相當一部分都繼承自原本的非 Go 系統。

Dropbox 公司當初為何選擇使用 Go?

Tammy 亦分享了 Dropbox 公司一步步增加 Go 語言使用量的軼聞趣事。

Hack 技術周成就 Go 速率限制器原型設計

在某一年的 Hack 技術周之前,Dropbox 的工程師們計劃針對各項服務分別進行限速與限流。因此,一位工程師決定在接下來的 Hack 技術周內構建一項通用服務以實現上述目標——而 RAT 也就此誕生。

RAT 的初始原型設計在 4 天之內即構建完成,并在第 5 天發布了演示。短短幾周之后,RAT 的大名在公司內部迅速擴散。另一位 Dropbox 工程師通過電子郵件與 Tammy 團隊取得了聯系,希望了解其如何在 Python 項目當中使用 RAT。整個整合進程進展順利,RAT 的采用率不斷提高,實用性也快速增強。目前,Dropbox 公司內已經有多個團隊在使用 RAT。

DBmanager

Dropbox 公司擁有超過 6000 套數據庫,這樣的大型系統自然需要自動化管理與監控措施與之配合。事實上,這些數據庫隨時隨地都在進行復制、故障轉移以及通過副本進行主體升級等等。

為了管理這一切,Dropbox 公司的一名工程師開發出 DBmanager——這是一套 Web UI,能夠幫助管理員快速查看全部 6000 多套數據庫中發生的狀況。另外,其還能夠將狀態信息發布至其它系統。

Dropbox 公司中的 Go 版本升級之路

在數百名工程師的配合下,Dropbox 公司小心翼翼地協調著 Go 語言各主要版本的升級工作。不過 Tammy 并沒有提到任何由升級帶來的問題,這表明整個過程應該相當順利!

下面來看一些有趣的事實:

  • Dropbox 公司最近剛剛完成生產服務當中由 Go 1.5 到 1.6 版本的升級;
  • 為了追蹤升級流程,工作人員創建了一份簡單的 Dropbox Paper 文檔,同時要求每位服務。

持有者報告進度并在必要時申請幫助。

Dropbox 公司決定在 1.6 版本遷移完成之后(包括各非生產服務),跳過 Go 1.7 并直接升級至 1.8 版本。

Dropbox 公司如何引導新晉工程師們使用 Go 語言

每一位 Dropbox 工程師都需要經歷同樣嚴格的 Go 語言培訓流程,具體包括:

  • 閱讀基礎設施拓撲資料、Go 語言風格指南以及 Protobuf 風格指南。
  • 嚴格但友好的代碼審查。
  • 利用 Go 語言構建一款娛樂性質的應用程序(一套應用商店)。
  • 學習利用 Bazel 構建并測試 Go 代碼。

經驗豐富的工程師大約需要一周時間以完成上述培訓。

Go 語言為 Dropbox 公司帶來哪些收益?又存在哪些不足?

總體而言,Dropbox 公司的 Go 應用之路非常成功。

  • 易于在 Go 語言環境下進行生產。
  • 易于在 Go 語言環境下編寫并消費服務。(人們也熱衷于此!)
  • Go 語言標準庫非常出色。
  • 調試工具(總體上)運作良好。

其中的關鍵在于,Dropbox 公司并沒有費力將 Go 編寫成的服務重寫為其它語言版本,這表明人們對其相當滿意。(有趣的是,Tammy 表示 Dropbox 公司也在部分使用 Rust,但其并不屬于 Go 的替代品。)

Dropbox 公司在使用 Go 語言時遇到哪些困難?

Tammy 證實稱,Go 語言最大的問題在于處理競態條件。

  • 數據競態類 bug 給調試、查詢與修復等工作帶來挑戰。
  • 一部分 Dropbox 工程師特別擅長處理 Go 語言的查詢機制,而另一部分工程師則選擇發揮自己的專長。
  • Go 數據競態檢測器有時候不起作用。確定這種不起作用的情況非常重要。
  • 必須以審慎的態度設計需要對數據進行并發訪問的 Go 程序。

Dropbox 公司重視工程師對于可靠性及持久性的關注度,因此他們亦應當有能力解決上述問題(事實上,這種并發處理問題在任何語言環境下都相當困難)。

來自: InfoQ

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!