減少云計(jì)算成本的12種編程技巧
譯文?譯者 | 李睿
審校 | 孫淑娟
削減云計(jì)算成本需要包括開(kāi)發(fā)人員在內(nèi)整個(gè)團(tuán)隊(duì)的努力。以下是開(kāi)發(fā)人員在云中運(yùn)行成本更低的軟件的一些技巧。
沒(méi)有什么比看到開(kāi)發(fā)的應(yīng)用程序得到病毒式傳播更能振奮開(kāi)發(fā)團(tuán)隊(duì)的精神了。這是一種美妙的感覺(jué),至少在每月的云賬單到來(lái)之前是這樣。一些開(kāi)發(fā)人員認(rèn)為,管理計(jì)算成本是Devops團(tuán)隊(duì)的責(zé)任。程序員在編寫(xiě)軟件之后并將其發(fā)布,然而卻讓他人擔(dān)心成本問(wèn)題。沒(méi)有比這更離譜的了。
明智的開(kāi)發(fā)人員知道他們開(kāi)發(fā)的應(yīng)用程序?qū)ζ髽I(yè)的收入有很大的影響。如果編寫(xiě)大量代碼導(dǎo)致應(yīng)用程度運(yùn)行速度較慢,需要更多的云計(jì)算資源才能運(yùn)行。而選擇更好的算法和編寫(xiě)更緊湊的代碼不僅僅是速度提升,而且編寫(xiě)良好的代碼運(yùn)行成本更低。
開(kāi)發(fā)人員并不總是能看到這種聯(lián)系。在他們自己的機(jī)器上編寫(xiě)代碼很容易,而購(gòu)買(mǎi)機(jī)器時(shí)需要為更多的內(nèi)存和額外的磁盤(pán)空間支付更多的費(fèi)用。如果有2TB的磁盤(pán)空間,可能不會(huì)注意到開(kāi)發(fā)的代碼消耗了多少空間。如果一個(gè)新算法的運(yùn)行時(shí)間是原來(lái)的兩倍,那么誰(shuí)會(huì)注意到額外的幾毫秒呢?但幾乎可以肯定的是,計(jì)算量倍增將會(huì)導(dǎo)致更大的云計(jì)算成本。
現(xiàn)代云平臺(tái)擅長(zhǎng)將資源利用率轉(zhuǎn)化為單項(xiàng)費(fèi)用。優(yōu)秀的云計(jì)算開(kāi)發(fā)人員明白,他們有能力在編寫(xiě)代碼時(shí)做出更明智的決策。它可以像運(yùn)行分析器來(lái)識(shí)別問(wèn)題一樣簡(jiǎn)單,或者避免不存儲(chǔ)必要的數(shù)據(jù)以減少內(nèi)存占用。
以下是開(kāi)發(fā)人員可以簡(jiǎn)化編程的12種方法,使應(yīng)用程序運(yùn)行起來(lái)更精簡(jiǎn)、更快、更便宜。
1.編寫(xiě)更快的代碼
大多數(shù)開(kāi)發(fā)人員不會(huì)花費(fèi)太多時(shí)間優(yōu)化他們的代碼。如果應(yīng)用程序在他們的筆記本電腦上快速運(yùn)行,不會(huì)注意到它是否會(huì)隨著時(shí)間的推移慢20%、30%甚至300%。該程序仍在瞬間響應(yīng)和運(yùn)營(yíng)。但是在服務(wù)器上發(fā)生數(shù)百萬(wàn)次時(shí),它們就會(huì)累積起來(lái)。仔細(xì)分析可以標(biāo)記緩慢的部分。重寫(xiě)它們可以減少應(yīng)用程序需要的實(shí)例數(shù)量。
2.降低內(nèi)存占用空間
使用的內(nèi)存數(shù)量是云實(shí)例定價(jià)的一個(gè)重要參數(shù)。在許多情況下,加倍使用內(nèi)存也會(huì)使成本加倍。開(kāi)發(fā)人員可以通過(guò)避免將數(shù)據(jù)保存在內(nèi)存中來(lái)降低內(nèi)存占用空間。一些流算法,如Java的流類(lèi),設(shè)計(jì)用于處理大型數(shù)據(jù)文件,而無(wú)需將其全部加載到內(nèi)存中。Apache DataSketches項(xiàng)目在不占用所有內(nèi)存的情況下為復(fù)雜的大數(shù)據(jù)統(tǒng)計(jì)數(shù)據(jù)生成近似答案。另一個(gè)好處是,減少內(nèi)存的占用可以加快算法。有時(shí),操作系統(tǒng)會(huì)開(kāi)始使用虛擬內(nèi)存將數(shù)據(jù)卸載到磁盤(pán)上。這可以防止崩潰,但會(huì)顯著降低應(yīng)用程序的速度。
3.使用較低分辨率的圖像和視頻
使用較低分辨率的圖像和視頻可以通過(guò)多種方式獲得回報(bào)。首先,存儲(chǔ)這樣的圖像和視頻將會(huì)降低更多的成本。其次,任何數(shù)據(jù)遷移費(fèi)用都會(huì)降低。第三,應(yīng)用程序?qū)τ脩?hù)來(lái)說(shuō)似乎更快捷。所有靜態(tài)圖像都應(yīng)該從一開(kāi)始就最小化。而最小化并不簡(jiǎn)單,因?yàn)樵谀承r(shí)候視覺(jué)質(zhì)量下降到足以讓用戶(hù)看到的程度。找到正確的權(quán)衡是一些程序員需要做出的設(shè)計(jì)決策。一些使用上傳圖像的應(yīng)用程序還可以在收到圖像后創(chuàng)建更小的縮略圖和降低分辨率的版本。像ImageMagik這樣的工具包和像WebP這樣的格式就是為此目的而開(kāi)發(fā)的。
4.轉(zhuǎn)儲(chǔ)不必要的數(shù)據(jù)
許多開(kāi)發(fā)人員都在存儲(chǔ)大量信息以備將來(lái)需要。他們用無(wú)窮無(wú)盡的列填寫(xiě)表格,然后從不刪除行。如果擁有硬件并且磁盤(pán)驅(qū)動(dòng)器有足夠的空間,那么額外的數(shù)據(jù)不會(huì)花費(fèi)任何費(fèi)用。但是云計(jì)算對(duì)一切服務(wù)都收費(fèi)。那么在將來(lái)真的需要所有這些數(shù)據(jù)嗎?用戶(hù)需要這么多細(xì)節(jié)嗎?轉(zhuǎn)儲(chǔ)一些舊數(shù)據(jù)可以節(jié)省存儲(chǔ)和過(guò)濾數(shù)據(jù)的費(fèi)用。
5.限制磁盤(pán)存儲(chǔ)
在云實(shí)例上使用本地磁盤(pán)不僅面臨風(fēng)險(xiǎn),而且成本高昂。本地磁盤(pán)空間通常設(shè)計(jì)得足夠快以保持操作系統(tǒng)高效運(yùn)行。許多開(kāi)發(fā)人員在具有1TB或更多TB存儲(chǔ)空間的個(gè)人計(jì)算機(jī)上創(chuàng)建代碼。云存儲(chǔ)很少如此便宜或容易獲得。云計(jì)算供應(yīng)商通常根據(jù)數(shù)據(jù)的存儲(chǔ)規(guī)模計(jì)費(fèi),因此最好的方法是使用盡可能少的存儲(chǔ)空間。因此,開(kāi)發(fā)人員需要考慮如何最大限度地減少應(yīng)用程序創(chuàng)建的臨時(shí)文件,以及所需的系統(tǒng)庫(kù)和軟件包。
6.清理日志
日志文件非常適合在開(kāi)發(fā)過(guò)程中識(shí)別問(wèn)題和調(diào)試軟件。但是一旦代碼投入生產(chǎn),就不需要保留所有代碼。所有額外信息都會(huì)阻塞本地磁盤(pán)或?qū)ο蟠鎯?chǔ)。在設(shè)計(jì)日志系統(tǒng)時(shí),將其配置為經(jīng)常刪除日志。許多日志包(如Log4j)可以設(shè)置為保留最少數(shù)量的日志并定期刪除它們。
7.采用無(wú)服務(wù)器
無(wú)服務(wù)器架構(gòu)計(jì)劃僅在其代碼運(yùn)行時(shí)計(jì)費(fèi),這在負(fù)載間歇性時(shí)可以節(jié)省大量費(fèi)用。即使是擁有持續(xù)不斷的用戶(hù)流的應(yīng)用程序,其死區(qū)時(shí)間也比開(kāi)發(fā)人員預(yù)期的要長(zhǎng)。許多無(wú)服務(wù)器定價(jià)計(jì)劃致力提供精簡(jiǎn)的編碼和非常快的性能,同時(shí)占用更少的內(nèi)存。計(jì)費(fèi)公式以毫秒為單位計(jì)算響應(yīng)時(shí)間,并僅按處理器被占用的時(shí)間計(jì)費(fèi)。作為開(kāi)發(fā)人員,可以立即獲得反饋,因?yàn)殚_(kāi)發(fā)人員可以直接跟蹤響應(yīng)時(shí)間,并查看代碼更改對(duì)響應(yīng)時(shí)間的影響。無(wú)服務(wù)器方法非常適合較小或更多實(shí)驗(yàn)性項(xiàng)目,并且其費(fèi)用通常可以低至每月幾美分。如果應(yīng)用程序只是偶爾運(yùn)行某些功能,那么使用無(wú)服務(wù)器可能是有意義的。
8.歸檔舊數(shù)據(jù)
隨著數(shù)據(jù)越來(lái)越舊,訪(fǎng)問(wèn)頻率也越來(lái)越低。可以通過(guò)設(shè)置應(yīng)用程序?qū)⑴f數(shù)據(jù)遷移到成本更低的存儲(chǔ)設(shè)備來(lái)預(yù)測(cè)這一點(diǎn)。一些云平臺(tái)對(duì)所謂的“冷存儲(chǔ)”收費(fèi)要低得多,這可能需要數(shù)分鐘甚至數(shù)小時(shí)才能傳送數(shù)據(jù)。Wasabi或Backblaze等其他云平臺(tái)專(zhuān)門(mén)用于Amazon S3對(duì)象的存檔存儲(chǔ),其收費(fèi)遠(yuǎn)低于主要云平臺(tái)。在某些情況下,他們甚至不收取數(shù)據(jù)流動(dòng)費(fèi)用。一旦數(shù)據(jù)不再處于高需求狀態(tài),立即卸載數(shù)據(jù)可能會(huì)非常經(jīng)濟(jì)高效。
9.簡(jiǎn)化CSS布局
如果看過(guò)一些框架生成的HTML標(biāo)簽,就會(huì)知道布局是多么的荒謬。它只是一直嵌套在DIV標(biāo)簽中的DIV標(biāo)簽,而生成和交付都需要支付費(fèi)用。而網(wǎng)頁(yè)設(shè)計(jì)師表示,只需通過(guò)更明智地使用CSS創(chuàng)建更簡(jiǎn)單的布局,就可以將帶寬費(fèi)用削減30%。
10.建立靜態(tài)網(wǎng)站
像React這樣的一些框架需要大量的計(jì)算能力,尤其是當(dāng)它們使用服務(wù)器端渲染等功能時(shí)。所有這些代碼都會(huì)增加每月的云計(jì)算賬單。一個(gè)相反的理念是創(chuàng)建一個(gè)靜態(tài)站點(diǎn),由從緩存逐字提供的不變的HTML、CSS和JavaScript塊構(gòu)建。使用內(nèi)容交付網(wǎng)絡(luò)可以通過(guò)將緩存移近用戶(hù)來(lái)進(jìn)一步加快交付速度。各種框架都包含這種靜態(tài)哲學(xué)。Jekyll、Hugo、Gridsome和Pelican只是一些工具,它們可以將所有內(nèi)容打包成一組緊湊而不變的文件。仍然可以使用AJAX調(diào)用將個(gè)性化構(gòu)建到頁(yè)面中,但是網(wǎng)站的大部分在服務(wù)器上產(chǎn)生的負(fù)載很小。
11.外化計(jì)算和存儲(chǔ)
隨著瀏覽器的功能變得越來(lái)越強(qiáng)大,一些框架使得將更多計(jì)算直接移動(dòng)到客戶(hù)端變得更加簡(jiǎn)單。出色的JavaScript或WebAssembly代碼可以將更多的負(fù)載推到用戶(hù)的機(jī)器上。一些開(kāi)發(fā)人員正在將其云層簡(jiǎn)化為一個(gè)數(shù)據(jù)庫(kù),其中包含一些用于身份驗(yàn)證的業(yè)務(wù)邏輯。而開(kāi)發(fā)人員使用靜態(tài)HTML和帶有輸出JSON的嵌入式過(guò)程的PostgreSQL服務(wù)器端版本運(yùn)行所有內(nèi)容。瀏覽器還有更復(fù)雜的本地存儲(chǔ)信息選項(xiàng),如HTML Web存儲(chǔ)標(biāo)準(zhǔn)和W3C索引數(shù)據(jù)庫(kù)API。它不再只是短字符串和Cookie。這些數(shù)據(jù)可以更快地獲得,因?yàn)樗粫?huì)通過(guò)互聯(lián)網(wǎng)傳播,并且它讓用戶(hù)知道他們的數(shù)據(jù)沒(méi)有存儲(chǔ)在一個(gè)集中的、可破解的數(shù)據(jù)庫(kù)中。當(dāng)數(shù)據(jù)可以免費(fèi)存在于用戶(hù)的機(jī)器上時(shí),為什么還要為數(shù)據(jù)存儲(chǔ)和泄露支付費(fèi)用呢?
12.任命成本工程師
一些開(kāi)發(fā)人員專(zhuān)門(mén)負(fù)責(zé)處理數(shù)據(jù)庫(kù),而有些人喜歡用精心設(shè)計(jì)的前端來(lái)創(chuàng)造美好的印象。現(xiàn)在云成本如此靈活,一些團(tuán)隊(duì)正式任命“成本工程師”來(lái)管理代碼成本和效率。成本工程師的首要任務(wù)是讓?xiě)?yīng)用程序代碼運(yùn)行得更干凈、更快、更輕,從而更便宜。讓這個(gè)任務(wù)成為成本工程師工作的一部分,并傳達(dá)說(shuō)明管理代碼成本作為開(kāi)發(fā)團(tuán)隊(duì)角色和責(zé)任一部分的重要性的信息。
原文鏈接:https://www.infoworld.com/article/3661809/12-programming-tricks-to-cut-your-cloud-bill.html




















