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