成功實現(xiàn)邊緣編碼需要了解的六大經(jīng)驗教訓(xùn)
隨著企業(yè)急于獲得邊緣所能提供的低延遲、靈活性、成本和性能方面的好處,邊緣計算的需求正在急劇擴大。IDC估計,2022年全球在邊緣硬件、軟件和服務(wù)方面的支出將達到1760億美元,比上一年增長14.8%,到2025年將達到2740億美元。因此,你的開發(fā)者很可能現(xiàn)在就在開發(fā)邊緣應(yīng)用,或者在不久的將來會這樣做。
然而,在你深入研究之前,有一些事情需要考慮。我作為企業(yè)架構(gòu)師有與開發(fā)組織合作的經(jīng)驗,讓我告訴你創(chuàng)建邊緣應(yīng)用時的一些教訓(xùn)。牢記這些教訓(xùn)可以幫助你避免走彎路,并確保你充分利用邊緣所能提供的優(yōu)勢。
教訓(xùn)1:挑戰(zhàn)你的思維方式
很多時候,開發(fā)者在創(chuàng)建邊緣應(yīng)用時,就好像它們與數(shù)據(jù)中心或云端的應(yīng)用一樣。但邊緣是一個不同的范式,需要用不同的方法來編寫代碼,也需要用深思熟慮的方法來選擇適合邊緣的應(yīng)用。
大多數(shù)開發(fā)者習(xí)慣于集中式的計算環(huán)境,在少量的服務(wù)器中擁有大量的計算資源。但是,邊緣計算將這種情況翻轉(zhuǎn)過來,相對適度的資源分布在不同地點的許多服務(wù)器上。這可能會影響任何一個邊緣工作負載的可擴展性。例如,一個使用大量內(nèi)存的應(yīng)用程序可能無法在成百上千的邊緣實例中很好地擴展。由于這個原因,大多數(shù)邊緣應(yīng)用程序?qū)⑹菍iT為邊緣設(shè)計的,而不是從現(xiàn)有的數(shù)據(jù)中心或云部署中“提升和遷移”。
你需要認真思考邊緣架構(gòu)如何影響你的應(yīng)用,以及哪些應(yīng)用將從這種分布式方法中受益。把邏輯帶到數(shù)據(jù)所在的地方通常更容易。因此,如果數(shù)據(jù)更加區(qū)域化,或者需要訪問大型集中式數(shù)據(jù)存儲,基于云的方法可能是合理的。但是,當(dāng)一個應(yīng)用程序使用在邊緣產(chǎn)生的數(shù)據(jù)時--例如來自在線用戶的請求/響應(yīng)、cookies和頭信息--這就是邊緣計算真正可以大放異彩之處。
教訓(xùn)2:不要忽視基礎(chǔ)知識
雖然將代碼分布到邊緣可以改善延遲和可擴展性,但它不會神奇地運行得更快。低效的代碼在邊緣也會同樣低效。如前所述,邊緣的每個存在點都會比典型的集中式計算環(huán)境受到更多的資源限制,特別是在無服務(wù)器的邊緣環(huán)境中。在為邊緣編寫代碼時,優(yōu)化效率對于充分利用這種架構(gòu)至關(guān)重要。
當(dāng)向邊緣推送功能相對快速和容易時,你仍然需要向管理其它代碼那樣應(yīng)用勤奮的管理流程。這包括良好的變更管理流程,將代碼存儲在源代碼控制中,并使用代碼審查來評估代碼質(zhì)量。
教訓(xùn)3:重新思考可擴展性
在邊緣,你是在“擴大”而不是“增加”。因此,你需要開發(fā)代碼以適應(yīng)每個請求的約束,而不是從每個服務(wù)器的約束角度考慮。這包括對內(nèi)存用量、CPU周期和每次請求時間的約束。制約因素會因你所使用的邊緣平臺而不同,所以了解它們并相應(yīng)地設(shè)計你的代碼很重要。
一般來說,你想用每個操作所需的最小數(shù)據(jù)集來操作。例如,如果你在邊緣做A/B測試,你只想存儲你正在操作的特定請求或頁面所需的數(shù)據(jù)子集,而不是整個規(guī)則集。對于基于位置的體驗,你只需要在一個輕量級的查詢中保存該邊緣實例所服務(wù)的特定州或地區(qū)的數(shù)據(jù),而不是所有地區(qū)的數(shù)據(jù)。
教訓(xùn)4:為可靠性編碼
確保邊緣應(yīng)用程序的可靠性對于提供積極的用戶體驗是絕對必要的。請確保在你的QA計劃中包括測試邊緣代碼。添加適當(dāng)?shù)腻e誤處理也很重要,以確保你的代碼能夠優(yōu)雅地處理錯誤,包括計劃和測試事件發(fā)生時的回退行為。例如,如果你的代碼超出了平臺的限制,要創(chuàng)建一個回退到一些默認的內(nèi)容,這樣用戶就不會收到一個影響他們體驗的錯誤信息。
進行分布式負載測試是一個很好的做法,可以確認你的應(yīng)用程序的可擴展性。一旦你部署了代碼,就繼續(xù)監(jiān)測平臺,以確保不超過CPU和內(nèi)存的限制,并跟蹤任何錯誤。
教訓(xùn)5:優(yōu)化性能
邊緣計算的主要好處是通過將數(shù)據(jù)和計算資源移至用戶附近而大幅減少延遲。當(dāng)你在成百上千個存在點(PoPs)上進行擴展時,創(chuàng)建輕量級、高效的代碼對于實現(xiàn)這一好處至關(guān)重要。完成一個功能所需的數(shù)據(jù)也應(yīng)該在邊緣。開發(fā)需要從集中式數(shù)據(jù)存儲中獲取數(shù)據(jù)的代碼會抹去邊緣提供的延遲優(yōu)勢。
對高效執(zhí)行的強調(diào)同樣適用于邊緣應(yīng)用所利用的任何第三方代碼。一些現(xiàn)有的代碼庫是低效的,損害了性能或超過了邊緣平臺的CPU和內(nèi)存限制。因此,在將任何代碼納入邊緣部署之前,要仔細評估它。
教訓(xùn)6:不要重復(fù)造輪子
雖然邊緣是一種新的模式,但這并不意味著你必須從頭開始編寫一切。大多數(shù)邊緣平臺都與各種內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)功能集成,允許你創(chuàng)建自定義邏輯,生成一個輸出信號,提示現(xiàn)有的CDN功能,如緩存。
把你的代碼設(shè)計成可重用的也是一個好主意,這樣它既可以在邊緣也可以在集中的計算環(huán)境中執(zhí)行。將核心功能抽象為不依賴瀏覽器、Node.JS或特定平臺功能的庫,可以使代碼具有“同構(gòu)性”,能夠在客戶端、服務(wù)器和邊緣運行。
使用現(xiàn)有的開源庫是避免重寫通用功能的另一種方式。但要注意那些需要Node.JS或瀏覽器功能的庫。并考慮與你正在使用的邊緣平臺集成的第三方開發(fā)商合作,這可以節(jié)省時間和精力,同時提供成熟的互操作性優(yōu)勢。
將這些經(jīng)驗付諸實踐
為了說明這些最佳實踐的影響,請考慮一個真實的案例:一個組織在邊緣實施地理圍欄應(yīng)用時遇到了困難。他們遇到了因超過平臺的CPU和內(nèi)存限制而導(dǎo)致的高錯誤率問題。
看看他們是如何建立自己的應(yīng)用程序的,他們有所有地理圍欄區(qū)域的數(shù)據(jù),900KB的JSON,存儲在每個邊緣PoP中。使用一個CPU密集型算法來檢查每個地理圍欄的興趣點,當(dāng)在檢查前幾個區(qū)域沒有找到興趣點時,就會觸發(fā)CPU超時。
為了解決這個問題,每個地理圍欄區(qū)域的數(shù)據(jù)被轉(zhuǎn)移到一個鍵值存儲(KVS)中,每個區(qū)域存儲在一個單獨的條目中。增加了一個輕量級的檢查,以確定一個興趣點的可能的“候選區(qū)域”(通常是1到3個候選區(qū)域)。完整的數(shù)據(jù)和CPU密集型檢查只在候選區(qū)域進行,極大地減少了CPU的工作量。這些變化將錯誤率降低到可忽略的水平,同時改善了初始化時間并減少了內(nèi)存的使用,如下圖所示。
圖1:成功率和錯誤率的前后對比(注意,成功和錯誤指標(biāo)的尺度不同,因此不能直接比較)。
圖2:初始化時間的前后比較
圖3:之前和之后的內(nèi)存使用情況比較(圖片來源:Akamai)
充分發(fā)揮邊緣的作用
邊緣計算為貼近用戶、快速高效地提供個性化用戶體驗的應(yīng)用程序提供了巨大的優(yōu)勢。成功的關(guān)鍵是確保應(yīng)用程序是一個很好的邊緣平臺候選者,然后優(yōu)化你的代碼,以充分利用邊緣平臺的功能,同時在其限制條件下工作。
請注意我在與組織合作中所學(xué)到的經(jīng)驗教訓(xùn),你可以以更快的速度獲得邊緣的優(yōu)勢,且沒有令人頭疼的問題。