天天看點

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

作者:阿裡雲雲栖号

前言:本文以阿裡雲函數的計算為例,提供線上調試、本地調試等應用優化和調試方案。

<無伺服器應用程式的>調試提示></h1>

在應用開發過程中,或者應用開發完成,結果并不出乎意料,我們要做一些調試工作。但是,在無伺服器體系結構下,調試通常受到正在開發的應用程式可以按預期在本地正常運作的環境的嚴重限制,但在 FaaS 平台上會出現一些不可預測的問題。而在一些特殊情況下,沒有本地模拟線上環境的方法,很難進行項目開發和調試。

無伺服器應用程式的調試一直是熱門話題,但雲供應商并沒有放棄對調試方向的深入探索。以阿裡雲函數計算為例,提供了線上調試、本地調試等多種調試方案。

< h1類"pgc-h-arrow-right-right"資料軌道""5">線上調試</h1>

1. 調試簡單

所謂簡單調試,就是在控制台中調試。在阿裡雲函數計算的情況下,可以通過執行按鈕在控制台中完成基本調試,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

該函數隻是線上調試頁面

如有必要,我們還可以通過設定事件來模拟一些事件,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

通過設定事件來模拟事件

聯機調試的好處是,可以使用某些聯機環境測試代碼。當線上環境具有 VPC 等資源時,很難在本地環境中進行調試,例如需要通過 VPC 通路的資料庫,或者具有要存儲觸發器的對象的業務邏輯。

2. 斷點調試

除了簡單的調試,一些雲廠商還支援斷點調試,比如阿裡雲功能計算的遠端調試、騰訊雲功能的遠端調試等。以阿裡雲函數計算遠端調試為例,可以通過控制台對函數進行線上調試。建立函數後,使用者可以選擇遠端調試,然後單擊"打開調試"按鈕,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

函數聯機斷點調試頁 (I)

開啟調試後,稍等片刻,系統将進入遠端調試界面,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

函數線上斷點調試頁 (II)

此時,您可以執行一些斷點調試,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

函數線上斷點調試頁面(三)

<h1類"pgc-h-right-arrow"資料跟蹤""19">本地調試</h1>

1. 指令行工具

目前,大多數FaaS平台為使用者提供了相對完整的指令行工具,包括AWS的SAM CLI,阿裡雲的Funcraft,以及無伺服器架構,Server Devlesss等開源項目,以及對多雲供應商的其他支援。通過指令行工具調試代碼的方法很簡單。對于無伺服器開發人員,阿裡雲函數計算在本地進行調試。

首先,請確定您在本地有一個函數計算項目,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

本地函數計算項目

然後在項目下執行調試指令,例如在 Docker 中,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

指令行工具調試函數計算

2. 編輯器插件

以VScode插件為例,下載下傳阿裡雲函數計算的VSCode插件并配置賬号資訊時,可以在本地建立一個新函數,并在點後調試斷點,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

VSCode 插件調試函數計算

函數調試完成後,執行部署等操作。

<其他調試方案> h1類"pgc-h-arrow-right-"data-track"""30"</h1>

1. Web 架構的本地調試

在阿裡雲FaaS平台上開發一個傳統的Web架構,使用Python語言作為Bottle架構的示例,該架構添加了以下代碼:

線上應用部署時,隻需在輸入方法中填寫 ndex.app 即可順利部署。

2. 本地模拟事件調試

對于非Web架構,我們可以在本地建構一個方法,例如調試對象存儲觸發器:

這允許通過構造事件對象來實作模拟事件觸發。

< h1 類""pgc-h-right-arrow" 資料跟蹤""39" >無伺服器應用程式優化</h1>

資源評估仍然很重要

無伺服器架構雖然按數量付費,但并不意味着它一定比傳統的伺服器租賃便宜。如果您沒有準确評估項目并且不恰當地設定了某些名額,則無伺服器體系結構的成本可能會很高。

一般來說,FaaS平台的費用與三個名額直接相關,即配置的功能規格(如記憶體規格),程式花費的時間以及産生的流量成本。通常,程式花費的時間可能與記憶體規範和程式本身處理的業務邏輯有關。流量費用與程式本身與用戶端互動的資料包的大小有關。是以,在這三個常見名額中,由于配置不規則,記憶體規格可能會導緻計費偏差相對較大。在阿裡雲函數計算的情況下,假設一個 Hello World 程式每天執行 10,000 次,不同大小的記憶體成本(不包括網絡費用)如表所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

從表中可以看出,當程式在128MB記憶體中正常運作時,如果記憶體規格設定不正确地設定為3072MB,則潛在的每月成本将飙升25倍!是以,在上線無伺服器應用程式之前,請評估資源,以便在更合理的配置中進一步降低成本。

合理的代碼包規格

代碼包大小在各個雲供應商的 FaaS 平台中受到限制。撇開雲供應商對代碼包的限制,隻需說出代碼包規範可能産生的影響,從函數的冷啟動過程可以看出,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

該函數冷啟動流程圖

在函數冷啟動期間,當上傳的代碼包太大,或者檔案太多導緻解壓縮太慢時,加載過程會變長,進一步導緻冷啟動時間變長。

想象一下,當有兩個壓縮包時,一個是100KB的代碼包,另一個是200MB的代碼包,這兩個包都是在千兆位内網帶寬下理想化的(即,無論磁盤存儲速度如何等),即使最大速度可以是125MB /秒,前者的下載下傳時間将小于0.01秒,後者為1.6秒。除了下載下傳時間,加上檔案的解壓縮時間,兩者之間的冷啟動時間可能相隔2秒。一般來說,對于傳統的Web界面,如果希望響應時間超過2秒,這實際上對很多企業來說是不可接受的,是以在打包代碼的時候盡量減小包的大小。在節點.js項目的情況下,在打包代碼包時,我們可以使用Webpack等方法壓縮依賴包的大小,進一步降低整體代碼包的規格,提高函數的冷啟動效率。

合理的重用執行個體

執行個體重用存在于各個雲供應商的FaaS平台中,以更好地解決冷啟動問題并更合理地利用資源。所謂執行個體重用是指執行個體完成請求,不釋放請求,但進入靜默狀态。在一定的時間範圍内,如果配置設定了新的請求,則直接調用相應的方法,無需初始化各種類型的資源等,大大減少了函數冷啟動的發生。為了驗證,我們可以建立兩個函數:

單擊控制台中的"測試"按鈕以測試這兩個函數,以檢視它們是否在日志中具有"Test",如表中所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

功能多路複用記錄

如您所見,執行個體重用實際上是一種存在的情況。此外,如果 print("Test") 語句是初始化的資料庫連接配接,或者如果函數 1 和 2 加載深度學習模型,則每次送出請求時是否執行函數 1,函數 2 是否可以重用現有對象?

是以,在實際項目中,有一些初始化可以作為函數2完成,例如:

在機器學習方案中,模型在初始化時加載,避免每次觸發函數時加載模型。

在初始化時建立連結對象,避免在每次送出請求時都建立連結對象。

其他一些需要在第一次加載時下載下傳和加載的檔案在初始化時實作,以提高執行個體重用效率。

善于利用功能特性

各個雲供應商的 FaaS 平台具有一些功能。所謂平台功能所指的這些功能可能不是CNCF WG-Serverless白皮書v1.0中指定或描述的功能,而僅僅是雲平台根據其自身的業務發展和願望從使用者的角度進行挖掘和實作的功能,并且可能隻是一個雲平台或多個雲平台的功能。如果利用得當,這些功能通常會導緻業務績效的品質提高。

1.預當機和預停止

在阿裡雲功能計算的情況下,随着平台的發展,使用者痛點(特别是阻礙傳統應用平滑遷移到無伺服器架構)如下。

異步背景名額資料延遲或丢失:如果在請求期間未成功發送,則可能會延遲到下一個請求,或者資料點可能會被丢棄。

同步發送名額的延遲增加:如果在每個請求結束時調用類似 Flush 的接口,不僅會增加每個請求的延遲,還會對後端服務造成不必要的壓力。

功能優雅下線:當執行個體關閉時,需要清理連接配接、關閉程序、報告狀态等。當執行個體在函數計算中脫機時,開發人員無法掌握它,并且 Webhook 通知函數執行個體脫機。

基于這些痛點,阿裡雲釋出了運作時擴充。此功能在現有的 HTTP 服務程式設計模型上進行了擴充,将 PreFreeze 和 PreStop Webhook 添加到現有的 HTTP 伺服器模型中。擴充開發人員負責實作 HTTP 處理程式,偵聽函數執行個體生命周期事件,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

适用于擴充程式設計模型和現有程式設計模型的草圖

PreFreeze:在每個函數計算服務決定當機目前函數執行個體之前,函數計算服務調用HTTP GET/prefreeze路徑,擴充開發人員負責實作邏輯,以確定在執行個體當機之前進行必要的操作,例如等待名額成功發送,如圖所示。名為 InvokeFunction 的函數的時間不包括 PreFreeze Hook 的執行時間。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

預當機時序圖

PreStop:在每個函數計算決定停止目前函數執行個體之前,函數計算服務調用HTTP GET/prestop路徑,擴充開發者負責實作邏輯,以確定在執行個體釋出之前進行必要的操作,例如等待資料庫連結關閉,以及報告, 更新狀态,依此類推,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

預置時間序列

2. 單執行個體多并發性

衆所周知,雲廠商的函數計算通常是請求級隔離,當用戶端同時啟動三個請求到函數的計算時,理論上會生成三個執行個體來響應,這可能涉及冷啟動和請求之間的狀态關聯等問題。是以,一些雲供應商提供了對單個執行個體進行多聚類處理的能力(例如,阿裡雲功能計算)。此功能允許使用者為函數設定執行個體并發度(InstanceConcurrency),其中單個函數執行個體可以同時處理多個請求,如圖所示。

無伺服器工程實踐|無伺服器應用程式優化和調試提示無伺服器應用程式調試提示聯機調試其他調試方案無伺服器應用程式優化

單執行個體多重效果草圖

如上圖所示,假設有三個請求同時處理,當執行個體并發設定為1時,函數計算需要建立三個執行個體來處理這三個請求,每個執行個體處理一個請求,當執行個體并發設定為10時(即一個執行個體可以同時處理10個請求), 函數計算隻需要 1 個執行個體來處理這三個請求。

單執行個體多并發的好處如下。

減少執行時間并節省資金。例如,偏置的 I/O 函數可以同時處理執行個體内的請求,進而減少執行個體數量,進而減少總體執行時間。

狀态可以在請求之間共享。多個請求可以在一個執行個體中共享一個資料庫連接配接池,進而減少與資料庫之間的連接配接數。

降低冷啟動的可能性。由于可以在一個執行個體中處理多個請求,是以建立的新執行個體數會減少,冷啟動的可能性也會降低。

減少專有網絡IP的使用。在相同的負載下,單執行個體多并發減少了執行個體總數,進而減少了 VPC IP 的占用空間。

單執行個體多并發場景更為廣泛,例如函數有更多時間等待下遊服務響應的場景。單執行個體多并發性還存在不适合您的應用程式的場景,例如當函數具有共享狀态且無法并發通路時,當單個請求的執行消耗大量 CPU 和記憶體資源時,并且不适合單執行個體多并發時。

作者簡介:劉宇(蔣偉)電子資訊博士,阿裡雲無伺服器産品經理,阿裡雲無伺服器雲傳教士,CIO學院特聘講師。

友情連結: http://click.aliyun.com/m/1000299610/

本文為阿裡雲原創内容,未經許可不得轉載。

繼續閱讀