上云上的差點(diǎn)破產(chǎn)是什么體驗(yàn)?

前言
2020年,很多小的初創(chuàng)公司因?yàn)橐咔榈脑?,紛紛倒閉關(guān)門,哪怕是勉強(qiáng)支撐的也大多是一蹶不振瀕臨破產(chǎn)。
有一家名為Milkie Way的美國小公司,沒有因?yàn)橐咔槭艿接绊?,本該是大展宏圖之際,卻差點(diǎn)被自己坑的申請破產(chǎn),這到底是怎么一回事呢?我們一起來看下吧。
這家Milkie Way是一個僅僅擁有8人團(tuán)隊(duì)的初創(chuàng)公司,創(chuàng)始人Sudeep Chauhan曾在谷歌工作,他們公司的作品https://announce.today 服務(wù)是一款類似于自動發(fā)布各種警告信息,包括地震、海嘯、各類事件、各類新聞的安全通知平臺,隨著疫情的發(fā)展,線上發(fā)布各種公告也讓他們看到了大展拳腳的最佳時機(jī)。但是沒想到的是因?yàn)閮?nèi)部測試期間的一些小疏忽,他們收到的是一紙 72000 美元(約 47 萬人民幣)的天價賬單!
為了能更好的服務(wù)于疫情期間,Milkie Way原本準(zhǔn)備開發(fā)一個 Announce-AI 項(xiàng)目,旨在自動發(fā)布由 AI 創(chuàng)建的上述各類安全內(nèi)容。為了開發(fā) Announce-AI,他們決定使用 Cloud Functions(谷歌發(fā)布的無服務(wù)器平臺),但是很快他們遇到一個問題,Cloud Functions 的超時時間長達(dá) 9 分鐘,無法滿足他們的使用需要,于是他們轉(zhuǎn)而開始研究Cloud Run(谷歌發(fā)布的另一款無服務(wù)器服務(wù))。

雖然當(dāng)時團(tuán)隊(duì)中的成員都對Cloud Run不太了解,但是碼農(nóng)的特質(zhì)就是在探索中不斷學(xué)習(xí),所以他們也沒覺得有什么不妥。同時因?yàn)?Cloud Run 不提供任何存儲功能,他們使用了 Firebase 作為數(shù)據(jù)庫。(因?yàn)檎军c(diǎn)規(guī)模很小,完全用不上 SQL Server 或者任何其他成熟的商業(yè)數(shù)據(jù)庫)

Sudeep Chauhan還非常小心的對這個GCP項(xiàng)目設(shè)置了 7 美元的云資源使用預(yù)算,很多小伙伴看到這里肯定會想,那這個項(xiàng)目最多也就是用光這7美元的預(yù)算咯,Sudeep Chauhan當(dāng)時肯定也是這樣想的。
部署完成之后他們就開始了一些常規(guī)的測試,并保持程序運(yùn)行,到了第二天,噩夢開啟!
首先,Sudeep Chauhan收到了一封關(guān)于Firebase自動升級的郵件,然后馬上又收到了7美元預(yù)算超支的郵件,當(dāng)時他倒是沒有怎么緊張,因?yàn)樗男庞每ㄔO(shè)置了100美元的消費(fèi)限額。但是當(dāng)他登錄Google Cloud Billing之后,看到了一張價值5k美元的賬單,瞬間腦海中一片空白。


不難想象,如果我在起床刷牙的時候看到我500額度的信用卡刷了一個幾萬的賬單出來,我也會當(dāng)場暈倒。當(dāng)時的Sudeep Chauhan一臉懵逼,真就像電影里拍攝的一樣,一方面他是完全不知道哪里在產(chǎn)生費(fèi)用,一方面這個費(fèi)用還在不停的增長,5 分鐘之后,賬單數(shù)額增長到了 15000 美元;20 分鐘后,數(shù)額增長至 25000 美元;2 個小時后,數(shù)額最終定格在 72000 美元。 是不是很夸張?
最后一籌莫展的Sudeep Chauhan和他的小伙伴只能關(guān)閉所有的服務(wù)用來停止賬單的增長。
第二天Sudeep Chauhan還聯(lián)系了許多律師事務(wù)所,甚至沒有一家事務(wù)所肯受理他的預(yù)約,不過也難怪,連他自己都沒搞明白這件事的來龍去脈。
最后經(jīng)過他們徹夜不眠的調(diào)查,終于發(fā)現(xiàn)事件的因果:
首先,F(xiàn)irebase 在提示條款中沒有提及會自動升級的情況下自動升了級
然后,谷歌的賬單結(jié)算有著一天的延遲,導(dǎo)致他們一天后才發(fā)現(xiàn)賬單已經(jīng)欠下巨款
再者,谷歌無視信用卡100美元的設(shè)置,導(dǎo)致天價賬單的產(chǎn)生
最后,關(guān)鍵的關(guān)鍵,就是為了解決Cloud Run 中的超時問題,使用了 POST 請求(將 URL 作為數(shù)據(jù))將作業(yè)發(fā)送至某一實(shí)例,且并發(fā)使用多個實(shí)例以替代串行使用單一實(shí)例。這樣 Cloud Run 中的每個實(shí)例只會抓取一個頁面,所以永遠(yuǎn)不會超時。這樣做的隱患就是:
1、不中斷的指數(shù)遞歸:由于沒有 break 語句,因此實(shí)例不知道該何時中斷。
2、POST 請求可以具有相同的 URL。Cloud Run 服務(wù)將陷入無限遞歸當(dāng)中;而最糟糕的是,這個遞歸將呈指數(shù)增長
從最后的數(shù)據(jù)來看,這套部署在 Cloud Run 的“Hello World”版本一共執(zhí)行了 1160 億次讀取與 3300 萬次寫入!
1160 億次!
所以按照Firebase 上的讀取操作成本:
(0.06 美元 / 100,000) * 116,000,000,000 = 69,600 美元!無怪乎那么貴了
從這個事情我們可以看到,云服務(wù)上部署了一個錯誤的算法,在完全不了解的情況下使用了Firebase,最終導(dǎo)致了天價賬單的產(chǎn)生,所以一般常識里面的一邊學(xué)習(xí)一邊開發(fā),其實(shí)是很危險的一個行為。
尤其是在云平臺上進(jìn)行一些不確定的開發(fā)測試,云平臺像是一把雙刃劍。如果使用得當(dāng),它確實(shí)威力巨大;但如果使用不當(dāng),后果也將極為嚴(yán)重。Firebase 也不像是能夠直接學(xué)習(xí)的編程語言,它是谷歌提供的一項(xiàng)容器化平臺服務(wù),其中使用的是大量預(yù)定義規(guī)則。
也千萬不要因?yàn)樵O(shè)置了某些消費(fèi)上限而掉以輕心,無論什么時候,一定要嚴(yán)謹(jǐn)?shù)膶Υ约旱拿恳欢未a每一個程序,清楚自己的程序做了什么產(chǎn)生了什么,尤其是那些容易在后臺持續(xù)運(yùn)行的進(jìn)程。
后記
不幸中的萬幸,谷歌在收到Milkie Way的完整事件反饋后,還是免除了這筆天價賬單,Milkie Way也避免了公司破產(chǎn)的厄運(yùn),當(dāng)然凡事也不會每次都那么幸運(yùn),Milkie Way的成員深知這個道理,在那之后花了幾個月時間學(xué)習(xí)云架構(gòu)和他們自己的業(yè)務(wù)體系,避免類似問題再次出現(xiàn)。
所以,無論什么時候,沒有投機(jī)取巧,沒有捷徑,只有不斷刻苦鉆研避免問題發(fā)生才是王道。
題外話,如果你覺得谷歌換成了國內(nèi)的那些巨頭,會免了這個賬單嗎?
往期推薦

