Go 部落格

Heroku 上的 Go

Keith Rarick 和 Blake Mizerany
2011年4月21日

本週的部落格文章由 Keith Rarick Blake Mizerany 撰寫,他們是 Heroku 的系統工程師。用他們自己的話說,他們“食、飲、睡都離不開分散式系統”。在這裡,他們討論了使用 Go 的經歷。

構建分散式系統帶來的一大問題是物理伺服器的協調。每臺伺服器都需要了解整個系統的各種事實。這些關鍵資料包括鎖、配置資料等等,並且即使在資料儲存故障期間也必須保持一致性和可用性,因此我們需要一個具有可靠一致性保證的資料儲存。我們對這個問題的解決方案是 Doozer,這是一個用 Go 編寫的新型、一致的、高可用性資料儲存。

Doozer 的核心是 Paxos,這是一系列用於在不可靠節點組成的不可靠網路中解決一致性問題的協議。雖然 Paxos 對於執行容錯系統至關重要,但它因難以實現而臭名昭著。即使是線上找到的示例實現,儘管為了教育目的進行了簡化,也仍然複雜難懂。現有的生產系統名聲更差。

幸運的是,Go 的併發原語大大簡化了任務。Paxos 是根據獨立的、併發的程序定義的,這些程序透過訊息傳遞進行通訊。在 Doozer 中,這些程序實現為 goroutine,它們的通訊實現為通道操作。就像垃圾收集器改進了 malloc 和 free 一樣,我們發現 goroutine 和通道改進了基於鎖的併發方法。這些工具使我們能夠避免複雜的簿記工作,專注於手頭的問題。對於實現如此一個以困難著稱的任務所需的程式碼行數之少,我們仍然感到驚訝。

Go 的標準包是 Doozer 的另一個巨大優勢。Go 團隊在納入哪些包方面非常務實。例如,我們很快發現有用的一個包是 websocket。一旦我們有了一個可用的資料儲存,我們需要一種簡單的方法來內省它並可視化活動。使用 websocket 包,Keith 在乘坐火車回家時就添加了網路檢視器,而且無需外部依賴。這真實地證明了 Go 在系統和應用程式設計方面的出色結合。

我們最喜歡的生產力提升之一是由 Go 的原始碼格式化工具提供的:gofmt。我們從未爭論過大括號的位置、製表符與空格的選擇,或者是否應該對齊賦值。我們只是同意,最終以 gofmt 的預設輸出為準。

部署 Doozer 令人滿意地簡單。Go 構建靜態連結的二進位制檔案,這意味著 Doozer 沒有外部依賴;它是一個單一檔案,可以複製到任何機器上並立即啟動,加入一個正在執行的 Doozers 叢集。

最後,Go 對簡單性和正交性的狂熱關注與我們對軟體工程的看法一致。就像 Go 團隊一樣,我們在 Doozer 中納入哪些功能方面是務實的。我們摳細節,寧願修改現有功能也不願引入新功能。從這個意義上說,Go 與 Doozer 是完美的匹配。

我們已經考慮了 Go 的未來專案。Doozer 只是一個更大系統的開端。

下一篇文章:Go 和 Google App Engine
上一篇文章:Introducing Gofix
部落格索引