Serverless比你預期要貴得多

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在運營一個持續集成(CI)公司多年後,你會發現架構決策中的許多隱藏成本。在本文,我想談談 Serverless 和它的主要替代方案——微服務(容器化)架構,它們之間的實際區別。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"架構介紹:Serverless和容器+CDN"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們在過去幾年看到的新產品中的絕大多數後端架構都屬於這兩者之一。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"Serverless"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"serverless核心思想是指定一個策略來創建新的Web服務器,而不是自己啓動它們。這樣一來,如果你的產品在某個地方出彩,獲得巨大的流量爆發,你的雲提供商可以啓動許多Web服務器副本,然後在流量減少時關閉這些Web服務器。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/84\/8411b3d7c5c699aee6773c97ac3c9489.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"serverless通常與其AWS商標名Lambda互用"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然,serverless最終還是會使用Web服務器。關鍵是你不必自己去創建這些服務器。你所要做的只是指定構建它們的方法,然後你的雲提供商會隨着併發請求數量的增加或減少來創建Web服務器的副本。即使對於用戶很少的小項目,你也可以通過在夜間沒有人訪問你的網站時關閉Web服務器來節省資金。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"容器 + CDN"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你可以將託管網站的計算成本最高的部分包給其他人,而非指定一個方法來創建Web服務器。這就是CDN的思路。當一個Web服務器的運行速度變慢,通常是由數百個請求要獲取相同的不怎麼變的資源。CDN會爲你負責這些常見的請求,例如靜態圖片。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/68\/68635c5cbd5503120ac6d24453071c7b.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"容器(左)和CDN(中間)處理來自用戶的數百個請求"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在這種架構中,你的網站用戶會從CDN請求資源,CDN將響應大部分(大約90%)請求。只有那些不能明顯緩存的請求會被轉發到你的容器。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"概述:serverless vs 容器"}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"serverless“Web服務器”通常是如何創建真正的Web服務器的方法,然後你的雲服務商會在一個訪問者首次請求某些東西時啓動一個Web服務器。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"容器通常啓動速度慢得多,因此你需要保持至少一臺Web服務器24\/7運行,以防有人訪問你的網站。"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Serverless理論上看起來更便宜"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當AWS Lambda在2014年推出時,它聽起來不可思議:1GB內存,每毫秒0.0000000167美元的計算量。一個典型的API請求可能是20ms,因此你需要爲每個請求支付0.000000334美元。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於大多數工作負載都非常“火爆”,因此即使是用Lambda託管一個非常流行的服務,你也只需要支付不到100美元每年。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"相比之下,對大多數產品來說,一個類似的容器+CDN架構可能耗費每年500美元。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然,這是一個非常簡單的比較(彈性負載均衡、CDN入口\/出口、serverless也可以使用CDN等...),但對於今天的大多數在線產品來說是正確的。在其它同等的情況下,serverless Web服務器的成本是類似的容器的10%-20%。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"開發者工資是serverless的隱藏成本"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"基礎設施成本是一個很好的指標——很容易預測,是比較一個“好架構”與一個“壞架構”的便捷方法。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然而,基礎設施成本與開發人員的工資相比卻相形見絀。每年500美元的容器會由一名每年75000美元的開發者維護。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"實際上,人力成本是很多公司低估的。如果你有一個本地無法復現的bug,開發人員使用一個閉源的AWS賬戶會很難復現和調試它。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"三個因素結合在一起讓用serverless進行開發變得異常困難:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你不能本地模擬serverless實例,只能在雲上模擬。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很少有公司能創建它們的生產環境的基礎設施的副本。開發人員通常會花幾個小時來申請合適的環境,並確保沒有其他人同時使用這個環境。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"開發人員很少能訪問生產環境資源,因此它們不得不花費數個小時協調一個編程會話才能在生產環境調試。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/82\/828fbeda02a58294e1d98b054a61714d.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"世界各地的slack工程頻道的一個常見場景"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果單個開發人員每週修復一個bug,並且由於上述因素,修復每個bug所需的時間延長一個小時,那麼你的公司每年會爲單個開發人員的生產力損失支付1872美元。這個數字已經是最初成本差異的4倍。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"相反,一個容器架構可能完全運行在一個開發人員的電腦上,因此每個開發人員都可以在他們自己的筆記本上重現bug,而不必使用一個演示(staging)環境。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"另一項成本:serverless會給客戶帶來更多bugs"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"出於與前一點相似的原因,使用一個持續集成\/持續部署系統自動測試一個serverless架構要困難得多。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"容器化架構更容易進行測試,因爲你可以在單個VM中運行它。想要運行持續集成,serverless架構需要請求你的雲服務商爲每次更改進行部署。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/b1\/b1d0b5fd6de7bbe307d69e5ee478f5fb.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"系統的最終測試是端到端(end-to-end,E2E)測試:通過創建一個假用戶,然後像一個真用戶一樣與整個應用程序進行交互,來驗證通用工作流程。如果可以根據需要創建架構副本,這些測試就能針對提出的更改自動運行。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在許多公司中,demo演示中的一個bug可能意味着損失6-7位數的銷售額。這些bug通常是影響不同組件交互的看似無害的更改結果。如果開發人員不在每次更改後測試這些流程是否繼續生效,那麼就很容易損壞一個“立即支付(pay now)”按鈕或者登入。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果整個堆棧能運行在單個機器上,那麼它就可以不怎麼麻煩地運行在一個持續集成服務商上。相比之下,一個serverless棧可能需要爲每個更改在你的雲服務商中從頭創建整個環境,這會花費10倍更長的時間。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"解決方案"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"顯然,對於服務器的解決方案是讓供應商採用一個通用標準(AWS kubeless或AWS OpenFAAS)。只要serverless與閉源雲產品同名,那麼就會因爲開發人員的生產力的損失而大大增加成本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"實際上,最好的解決方案是完全避免使用AWS Lambda或Cloudflare Workers這樣的平臺作爲核心基礎設施,直到能自行託管它們進行問題復現和測試。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於幾乎每一個架構決策,託管成本都比開發者行動緩慢的成本要重要得多。在考慮到需要使用基礎設施工作的開發人員的時間成本之前,不要因爲價格來進行架構決策。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"https:\/\/layerci.com\/blog\/the-hidden-costs-of-serverless\/"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章