Go 部落格
Heroku 的 Go
本週的博文由 Heroku 的系統工程師 Keith Rarick 和 Blake Mizerany 撰寫。他們用他們自己的話說,“吃、喝、睡分散式系統”。在這裡,他們討論了他們使用 Go 的經驗。
構建分散式系統時遇到的一個大問題是物理伺服器的協調。每臺伺服器都需要了解系統整體的各種資訊。這些關鍵資料包括鎖、配置資料等,並且必須在資料儲存失敗的情況下保持一致和可用,因此我們需要一個具有可靠一致性保證的資料儲存。我們解決這個問題的方案是 Doozer,一個用 Go 編寫的、新的、一致的、高可用的資料儲存。
Doozer 的核心是 Paxos,這是一系列在不可靠節點組成的不可靠網路中解決一致性問題的協議。雖然 Paxos 對於執行容錯系統至關重要,但它以實現困難而聞名。即使是線上可以找到的示例實現,儘管為了教育目的進行了簡化,但仍然很複雜且難以理解。現有的生產系統聲譽更差。
幸運的是,Go 的併發原語使這項任務變得容易得多。Paxos 在概念上是獨立、併發執行的程序,它們透過傳遞訊息進行通訊。在 Doozer 中,這些程序被實現為 goroutine,它們的通訊被實現為 channel 操作。就像垃圾回收器改進了 malloc 和 free 一樣,我們發現 goroutine 和 channel 比基於鎖的併發方法有所改進。這些工具使我們能夠避免複雜的簿記,並專注於當前的問題。我們仍然對我們用如此少的程式碼量實現瞭如此出名的困難的東西感到驚訝。
Go 中的標準包是 Doozer 的另一個巨大優勢。Go 團隊在軟體包的組成上非常務實。例如,我們很快發現有用的一個包是 websocket。一旦我們有了可用的資料儲存,我們就需要一種簡單的方法來內省它並可視化活動。使用 websocket 包,Keith 可以在回家的火車上新增 Web 檢視器,而無需外部依賴。這真正證明了 Go 在系統程式設計和應用程式程式設計方面的結合有多麼出色。
Go 的原始碼格式化工具:gofmt,為我們帶來了最喜歡的生產力提升之一。我們從未爭論過花括號的位置、製表符還是空格,或者是否應該對齊賦值。我們簡單地同意,這一切都由 gofmt 的預設輸出決定。
部署 Doozer 非常簡單,令人滿意。Go 構建靜態連結的二進位制檔案,這意味著 Doozer 沒有外部依賴;它是一個可以複製到任何機器並立即啟動以加入執行的 Doozers 群集的單個檔案。
最後,Go 對簡潔性和正交性的狂熱關注與我們對軟體工程的看法一致。與 Go 團隊一樣,我們在 Doozer 的功能選擇上也很務實。我們注重細節,寧願修改現有功能而不是引入新功能。從這個意義上說,Go 與 Doozer 是完美匹配。
我們已經為 Go 規劃了未來的專案。Doozer 僅僅是更大系統的一個開始。
下一篇文章:Go 與 Google App Engine
上一篇文章:Introducing Gofix
部落格索引