我已將程式碼部署到:
裸機伺服器,風扇故障時發出刺耳的尖叫聲。
凌晨3點,VPS伺服器神秘重啟。
需要三個 YAML 參數和一個 Helm 咒語的 Kubernetes 叢集。
當然還有 AWS——只有它的帳單才是真正一致的執行時。
經過多年的「雲端原生架構」實踐,我意識到了一些令人不安的事情:
雲端不是你的電腦。
這是一場談判。
當你寫 Go 程式碼:
err := db.QueryRowContext(ctx, query).Scan(&user.ID)
感覺像是命中註定。
當你寫 Rust 程式碼時:
let user = repo.find_user(id).await?;
感覺很安全。有條理。可控。歸心似箭。
您認為:
這段程式碼是我寫的。我了解這個系統。
但是在雲端呢?
您的“伺服器”是虛擬的。
您的「磁碟」已連接至網路。
您的「網路」是軟體定義的。
你的「安全邊界」是某人從 StackOverflow 複製貼上過來的 IAM 策略。
您目前未執行任何軟體。
你租用的是機率。
Go 是Google為大型分散式系統開發的。
它假定失敗。
if err != nil {
return err
}
那不是錯誤處理。
這就是分散式系統創傷。
Go開發者明白一些前端工程師通常不懂的事:
一切都失敗了。
所有操作都會逾時。
所有操作都會重試。
一切都是謊言。
AWS 也印證了這一點。
你的 Lambda 冷啟動。
您的 ECS 任務已重新排程。
您的EKS節點消失了。
您的 RDS 連線池靜默失效。
Go 無法對抗這種混亂。
它聳聳肩,然後返回error 。
Rust 說:
只有證明自己配得上,才能獲得記憶體。
它迫使你直面所有權、生命週期和可變性。
然後我們將這個記憶體安全的二進位部署到:
容器
在節點上
在集群上
在 VPC 中
負載平衡器後面
在 CDN 後面
在WAF背後
在別人的資料中心後面
你取消了use-after-free 。
恭喜。
現在除錯為什麼你的 pod 無法連接到 S3,因為你的 IAM 角色缺少s3:ListBucket 。
曾幾何時,「堆疊追蹤」是有意義的。
現在堆疊看起來是這樣的:
Rust 二進位檔案
Docker
Kubernetes
舵
Terraform
AWS
我是
VPC
子網
路線表
NAT網關
網際網路閘關
雲端提供者控制平面
未知的行星排列
你修復了程式碼中的一個錯誤。
問題出在一個安全群組。
你增加了CPU佔用率。
問題出在檔案描述符長度限制。
你進行水平縮放。
問題出在缺少索引。
我們過去常常除錯函數。
現在我們來除錯生態系統。
AWS 不會發出很大的故障警報。
它會優雅地退化。
哪個更糟?
您的服務不會崩潰。
它的速度剛好慢到足以讓使用者悄悄離開。
計費控制面板呢?
它具有完美的可擴展性。
因為沒有日誌,所以你不會注意到bug。
你之所以會注意到,是因為你的信用卡公司打了電話給你。
你可以對巨石建築發表任何看法。
他們是:
可預測的
可部署
可以理解
可偵錯
當系統故障時,你透過 SSH 連接到其中一台機器。
您已查看日誌。
你把它修好了。
現在?
你打開:
CloudWatch
X射線
普羅米修斯
格拉法納
傑格
資料狗
還有三個 Terraform 標籤頁
你仍然不知道為什麼會發生503錯誤。
儘管如此…
Go 和 Rust 在雲端蓬勃發展。
為什麼?
因為它們是身處不誠實環境中的誠實語言。
Go 將失敗視為一種重要的價值。
Rust 在編譯時強制執行正確性。
兩者都能降低本質上存在不確定性的系統的不確定性。
雲層一片混亂。
Go 和 Rust 都是紀律。
正是這種張力讓他們走到了一起。
如今最優秀的雲端運算工程師不僅擅長編寫程式碼。
他們明白:
網路拓撲
IAM爆炸半徑
可觀測性策略
延遲預算
反壓
故障域
成本模型
換句話說:
我們並沒有停止做系統工程師。
我們只是將硬體外包,結果卻增加了複雜性。
最終,雲端運算並沒有讓工程變得更容易。
它使責任變得抽象化。
抽象即力量。
但任何抽像都會造成漏洞。
Go 會因error而洩漏。
Rust 會透過Result洩漏。
AWS 的資訊外洩會透過您的發票外洩。
巨石從未對你說謊。
雲朵禮貌地微笑著,以毫秒為單位充電。