多年來,我的雲端架構一直感覺……還算合理。
Go 服務
AWS 基礎設施
到處都是貨櫃
上面撒了一些Lambda
儀錶板大部分為綠色
部署速度很快,工程師們工作效率很高,沒有人抱怨。
現在回想起來,這應該是我的第一個警示訊號。
因為在雲端,系統通常不會發生明顯的故障。
它們在財務上失敗了。
Go遊戲有一種危險的魔力,它能讓人感覺一切都在掌控之中。
你寫一個服務。
它能立即編譯。
部署過程非常順利。
它會一直運作下去。
這種語言賦予你:
一個簡單的並發模型
強大的標準庫
可預測的結構
小型靜態二進位文件
AWS 為您提供:
無限容量(理論上)
一切都安排妥當了。
自動縮放
警報器只有在為時已晚時才會響起
它們共同營造出一種強大的幻象:
“這套系統之所以高效,是因為它很簡單。”
早期,這種錯覺大多是正確的。
公平地說,Go 成為雲端平台的預設語言絕非偶然。
1. 開發人員吞吐量至關重要
Go 可以最大限度地減少決策疲勞:
一種格式樣式
一個依賴系統
實現並發的一種方法是
一個明顯的部署工件
你不會花幾週時間爭論架構設計,直接發布產品就行了。
在雲端環境中,上線時間往往比微優化更重要。
2. 冷啟動很友好
與基於 JVM 的技術堆疊相比,Go 二進位檔案:
快速啟動
載入最小執行時狀態
與 Lambda 和容器自動擴縮容良好配合
單憑這一點,Go 就足以成為 AWS 的首選。
3. 執行可預測性
大多數 Go 服務都以乏味的方式失敗:
恐慌顯而易見
記憶體使用情況基本穩定。
績效斷崖式下跌是漸進的。
這樣一來,輪班待命製度就變得可以承受了。
所以,是的-圍棋配得上它的地位。
關於雲端系統,有以下幾點要注意:
他們不會立即懲罰效率低下的行為。
相反,他們悄悄地進行著:
這裡 CPU 使用率 +10%。
那裡有+200MB內存
再舉一個例子,「以防萬一」。
更大的任務規模,因為「這樣比較安全」。
沒有哪一項決定是令人憤慨的。
它們共同作用,會形成複合體。
您的AWS帳單不會飆升。
它悄悄地爬。
而悄悄增加的成本最難應付——因為表面上看不出有什麼問題。
Go 的垃圾回收機制是它最偉大的成就之一。
這也是其最大的雲端運算隱患之一。
現代圍棋GC是:
低延遲
並行
針對大多數工作負載進行了最佳化
但「調校良好」並不意味著免費。
額外的記憶體空間以避免壓力
標記清除期間的 CPU 週期
負載下延遲不可預測
降低貨櫃密度
單就這一點而言,沒問題。
從規模來看,這就變成了基礎設施政策。
你不會直接注意到垃圾回收。
你會在以下情況下注意到這一點:
你為了「安全起見」增加了任務記憶體。
避免了更緊密的實例打包
你的水平縮放比預期要早。
AWS 並不在乎你為什麼需要更多資源。
它只是負責開立發票。
我並非某天起床突然想到:
“我應該用 Rust 重寫一下,純粹是為了好玩。”
當 Go 不再默默無聞時,Rust 就出現了。
特定的工作負載導致了這個問題:
高吞吐量攝取服務
流式管道
即時資料處理
熱點路徑每秒執行數百萬次操作
這些服務並非業務邏輯密集型服務。
它們是物理密集型服務。
正是從那時開始,圍棋開始出現摩擦。
讓我們現在來破除一個迷思:
Rust 並不能神奇地讓你的系統運作速度變快。
它的作用是消除藉口。
Rust 迫使你面對:
分配模式
所有權邊界
記憶體佈局
快取行為
線程通信
在 Go 語言中,你可以長時間忽略這些事情。
在 Rust 中,這是不可能做到的。
這就是關鍵所在。
說實話。
我的第一個 Rust 微服務:
寫作時間延長了3倍
編譯器錯誤比實際程式碼還多
這讓我開始反思自己的人生選擇。
但是一旦它執行起來……就發生了奇怪的事情。
記憶體使用情況
穩定的延遲
CPU 位置完全符合預期
負載下未出現意外
該服務表現得像一個實體物件。
可預測的。可衡量的。誠實的。
Rust 不僅僅是修改程式碼。
它改變了建築結構。
1. 停止過度分配「以防萬一」的資源
因為分配是明確的,所以你:
重複使用緩衝區
串流資料
以世代為單位思考,而不是以數量為單位思考。
這直接減少了記憶體佔用。
2. 設計時要考慮資料流,而不是便利性。
Rust 會引導你走向:
明確的所有權邊界
預設情況下不可更改的資料
顯性突變點
這有助於形成更簡單的並發思考模型。
3. 先進行垂直縮放,再進行水平縮放
當服務有效率時,您可以:
每個實例可以打包更多工作負載
延遲自動縮放
減少跨服務通信
AWS定價注重垂直整合效率。
事情到這裡變得令人不安地具體起來了。
EC2
Rust 服務在較小的實例類型上也能流暢運作。
Go 服務需要更多記憶體餘裕
快取效率比原始核心數更重要
ECS/EKS
Rust 提高了容器密度
更少的記憶體溢出死亡
更可預測的自動擴縮容行為
Lambda
鏽蝕冷啟動性能始終較低
記憶體與效能比更好
降低 CPU 密集型功能的成本
單憑基準測試無法反映這些特點。
它出現在每月的發票上。
這不是語言之爭。
這是一個資源分配問題。
真正奏效的是精心設計的語言運用。
Go 語言仍然非常適合:
蜜蜂
控制平面
行政服務
膠水程式碼
原型製作
業務邏輯
Rust Shines at:
資料管道
高吞吐量服務
延遲敏感元件
CPU密集型工作負載
邊緣服務
AWS 並不在乎你喜歡哪種語言。
它很在意你如何有效率地利用矽。
當 Go 和 Rust 服務並排執行後,可觀測性就不再是抽象的概念了。
指標使這些差異顯而易見:
記憶曲線
尾延遲
CPU飽和度
縮放行為
這些系統之間不存在競爭關係。
它們揭示了權衡取捨。
Go 值:
簡單
發展速度
團隊可擴展性
Rust 價值觀:
正確性
明確性
長期效率
AWS 值:
使用率
可預測性
你沒有問有關價格的問題。
選擇一種語言,就是選擇你想為哪些價值觀付費。
早期團隊絕對應該優先考慮速度。
去那裡玩很棒。
但隨著系統日趨成熟:
利潤率收緊
負荷增加
法案不再只是理論。
那時效率就不再是「過早優化」了。
並開始進行基礎設施衛生工作。
雲端並不在意美觀。
它不在乎潮流。
它不在乎你喜歡用什麼語言。
它測量的是:
CPU週期
記憶體使用情況
網路流量
時間
然後它會按此收費。
Go 能幫助你快速行動。
Rust 可以幫助您了解成本。
AWS 會確保您了解其中的差異。
原文出處:https://dev.to/art_light/go-made-me-fast-rust-made-me-care-aws-made-me-pay-2f82