溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

開發(fā)函數(shù)計算的正確姿勢——輕松解決大依賴部署

發(fā)布時間:2020-03-03 11:09:00 來源:網(wǎng)絡 閱讀:211 作者:阿里系統(tǒng)軟件技術(shù) 欄目:云計算

<a name="1"></a>

前言

首先介紹下在本文出現(xiàn)的幾個比較重要的概念:

函數(shù)計算(Function Compute): 函數(shù)計算是一個事件驅(qū)動的服務,通過函數(shù)計算,用戶無需管理服務器等運行情況,只需編寫代碼并上傳。函數(shù)計算準備計算資源,并以彈性伸縮的方式運行用戶代碼,而用戶只需根據(jù)實際代碼運行所消耗的資源進行付費。函數(shù)計算更多信息 參考。開發(fā)函數(shù)計算的正確姿勢——輕松解決大依賴部署
Fun: Fun 是一個用于支持 Serverless 應用部署的工具,能幫助您便捷地管理函數(shù)計算、API 網(wǎng)關(guān)、日志服務等資源。它通過一個資源配置文件(template.yml),協(xié)助您進行開發(fā)、構(gòu)建、部署操作。Fun 的更多文檔 參考。
NAS: 阿里云文件存儲NAS是一個可共享訪問,彈性擴展,高可靠,高性能的分布式文件系統(tǒng)。在函數(shù)計算的場景中,由于其有代碼包的限制,可以使用 NAS 存放一些不經(jīng)常變動的文件,比如數(shù)據(jù)模型、靜態(tài)資源等。參考。
ROS: 阿里云資源編排服務(ROS)助您簡化云計算資源的管理。您可以遵循ROS定義的模板規(guī)范,在模板中定義所需云計算資源的集合及資源間依賴關(guān)系。ROS自動完成所有資源的創(chuàng)建和配置,實現(xiàn)自動化部署和運維。更多文檔參考。

備注: 本文介紹的技巧需要 Fun 版本大于等于 3.4.0。

基本上所有的 faas 平臺為了優(yōu)化函數(shù)的冷啟動,都會加入代碼包的限制。阿里云函數(shù)計算(FC)也不例外。FC 要求壓縮后的代碼包大小不超過 50MB。由于用戶的函數(shù)代碼可能需要大量的依賴庫,所以代碼包很容易達到函數(shù)計算設定的閾值。

<a name="N8vb4"></a>

傳統(tǒng)解決方式

基于平臺硬性要求下,依然有很多途徑來解決函數(shù)計算上傳代碼包大小受限的問題。下面列舉 3 種常見的解決方案。 備注: 包括不局限于以下方案。
<a name="8fMeA"></a>

1. 提交工單

提交函數(shù)計算工單,由后臺人員為您賬號開通上傳限制白名單。但提交工單依然有代碼包的限制。部署時代碼包上傳時間長,并且也增加了函數(shù)的冷啟動時間,影響函數(shù)性能。PS:通過使用預留模式可以完全去除冷啟動,由于超出本文范圍,這里不再闡述。
<a name="NoH42"></a>

2. 利用 OSS 來實現(xiàn)

對代碼包進行分類,除項目代碼和少量依賴庫可以在創(chuàng)建函數(shù)時上傳到函數(shù)計算,用戶將部分依賴庫預先上傳到 OSS,并在函數(shù)被觸發(fā)執(zhí)行時開始從 OSS 上加載依賴, 這類依賴的加載操作均可定義應用層冷啟動,當加載依賴結(jié)束后,應用層冷啟動才結(jié)束,函數(shù)的處理邏輯才開始執(zhí)行,應用層冷啟動的開銷往往會導致毛刺的產(chǎn)生,影響函數(shù)的性能。您可以將從 OSS 加載代碼包的代碼邏輯放在 initializer 函數(shù)中。既可以解決函數(shù)計算對上傳代碼包的限制問題,又不影響函數(shù)的性能。但需要用戶進行額外的操作。參考使用 initializer 接口解決函數(shù)計算上傳代碼包大小受限問題。
<a name="7YbXE"></a>

3. 基于文件系統(tǒng) Nas

我們通過 NAS 存放一些體積比較大且不易變動的資源。這使得即使在依賴比較大的場景下依舊適用。NAS 在幫助函數(shù)計算解決大依賴問題的同時,由于其自身的配置也比較復雜,也增加了函數(shù)計算的使用難度。如何管理 Nas 資源、上傳本地資源到Nas 以及服務級別的 Nas 相關(guān)配置參考開發(fā)函數(shù)計算的正確姿勢 —— 使用 Fun NAS 管理 NAS 資源。

本文旨在介紹第四種方式 -- 使用 Fun 工具來解決函數(shù)計算對上傳代碼包的限制,使得部署步驟簡單明了,不需關(guān)心額外的配置。同時也展現(xiàn) Fun 工具對大依賴場景的順滑體驗,Let's go!

:已經(jīng)獲得 fc 支持的 runtime 有 nodejs6,nodejs8,nodejs10,python2.7,python3,java8,php7.2,dotnetcore2.1,custom。目前基于所有 fc 支持的 runtime,大依賴場景下除 php7.2 和?dotnetcore2.1 其他都支持。

<a name="qev38"></a>

環(huán)境準備

Fun 安裝教程 可以直接在這里下載二進制版本的 Fun,解壓后即可使用。<br />執(zhí)行 fun --version 檢查 Fun 是否安裝成功。

$ fun --version
3.4.0

<a name="5Qjsm"></a>

Fun 判定大依賴的標準是什么?

fun install 是 fun 工具的一個子命令,用于安裝 pip,apt 依賴等,提供了命令行接口和 Funfile 描述文件兩種形式。對于 fun install 安裝的依賴,當 fun deploy 部署時會自動處理大依賴。

當 Fun 檢測打包的代碼壓縮后超過限制(50M),會根據(jù)對應的 runtime 分離大依賴和代碼。Fun 會將大依賴目錄分為:系統(tǒng)依賴和語言依賴。系統(tǒng)依賴的本地路徑為 .fun/root,語言依賴根據(jù)函數(shù) runtime 得到,各個 runtime 對應的大依賴目錄映射如下:

語言(runtime) 大依賴目錄(directory)
nodejs6 node_modules
nodejs8 node_modules
nodejs10 node_modules
python2.7 .fun/python
python3 .fun/python
java8 .fun/build/artifacts
custom /

自定義執(zhí)行環(huán)境 custom?大依賴目錄為 /,可以理解為其他 runtime 大依賴目錄的合集。例如:函數(shù) runtime 為 custom,若目錄下存在 node_modules.fun/python 等,F(xiàn)un 在部署向?qū)н^程中會把它們都認定為大依賴,會分別對其處理。

<a name="z0lAH"></a>

Fun deploy 對大依賴的支持

函數(shù)計算的命令行工具 Fun 現(xiàn)在原生支持了這種大依賴部署,不需要任何額外操作。僅僅執(zhí)行 fun deploy

$ fun deploy

整體流程如下圖所示:

開發(fā)函數(shù)計算的正確姿勢——輕松解決大依賴部署cdn.nlark.com/yuque/0/2020/png/502931/1579052914872-bf485f36-5771-4075-a764-5d8497624536.png">

fun deploy 會自動完成依賴的部署。而當檢測到打包的函數(shù)目錄超過了平臺的限制時,會進入到配置向?qū)?,幫助用戶自動化地配置。即上圖可以理解為:Fun 通過內(nèi)置 NAS(阿里云文件存儲)解決方案,可以一鍵幫用戶創(chuàng)建、配置 NAS,并上傳依賴到 NAS 上。而函數(shù)計算在運行時,可以自動從 NAS 讀取到函數(shù)依賴。

<a name="ywydr"></a>

大依賴向?qū)?/h5>

大依賴向?qū)Р糠纸貓D如下:

開發(fā)函數(shù)計算的正確姿勢——輕松解決大依賴部署

Fun 部署當前函數(shù)時,檢測到壓縮后(.zip)依賴超過了 50M,提示配置向?qū)Вê罄m(xù)日志省略...)。只需要輸入回車或 yes 即可。最后 Fun 會自動完成配置,成功部署資源到函數(shù)計算。

<a name="si7tS"></a>

體驗升級

fun deploy 大依賴向?qū)瓿珊螅瘮?shù)會部署到函數(shù)計算并對外提供服務。此時大依賴和代碼通過 NAS 進行了分離,再次部署時打包本地代碼目錄時由于沒有了大依賴,所以部署速度會非常的快。

這里推薦一篇使用 fun deploy 進行大依賴部署的實戰(zhàn)案例,展示了 Fun 工具對大依賴場景的順滑體驗Serverless 實戰(zhàn) —— 快速開發(fā)一個分布式 Puppeteer 網(wǎng)頁截圖服務。

<a name="YgNwx"></a>

Fun package 對大依賴的支持

Fun Package 是用來將代碼、編譯產(chǎn)物、靜態(tài)資源等本地資源上傳到 OSS 的功能。使用 fun Package 的場景,通常是,想僅僅通過一個模板文件進行部署的場景。比如,本地開發(fā)完成后,可以通過 fun package,將模板依賴的本地資源上傳到 OSS,這樣,無論是在其他服務器上部署,還是使用 ROS 部署時,僅僅通過一個文本格式的模板文件,就可以完成了。推薦閱讀?Fun Package 功能介紹。

<a name="Pt08i"></a>

非大依賴場景

流程如下圖所示:

開發(fā)函數(shù)計算的正確姿勢——輕松解決大依賴部署

通過 Fun Package 可以將模板文件包含的本地資源一鍵上傳到 OSS 上,完成資源的打包操作。

<a name="bVFso"></a>

模版文件差異

將打包后的模板文件(template.packaged.yml)與原文件相比較,可以發(fā)現(xiàn),差異僅僅在使用了本地資源的場景,比如:

- CodeUri: './'
+ CodeUri: 'oss://bucket/PackageDemo/function/39ce6e9109a23d313bc267b1a5211273'

<a name="udyp8"></a>

大依賴場景

流程如下圖所示:

開發(fā)函數(shù)計算的正確姿勢——輕松解決大依賴部署

當遇到打包的函數(shù)體積過大時,同樣會進入大依賴向?qū)?,F(xiàn)un 內(nèi)置 Ros 的解決方案,幫你完成自動配置。同時 Fun 會分開大依賴和代碼并分別上傳到 OSS。這樣做的目的下文中會有提到。

<a name="0zA7R"></a>

模版文件差異

大依賴場景下打包完成后生成的 template.packaged.yml 模版文件會與非大依賴場景下有所不同,除上述?CodeUri 的差異外,還會新增許多資源描述作為使用 Ros 部署時的前置條件,例如 NasCpFunc ,?這里只介紹一種,其它不做贅述。

NasCpFunc:
  Type: 'Aliyun::Serverless::Function'
  Properties:
    Handler: index.cpFromOssToNasHandler
    Runtime: nodejs8
    CodeUri: 'oss://ellison-hongkong/9e610f5540e21ace83d5b742241da6aa'
    MemorySize: 3072
    Timeout: 300

NasCpFunc?為大依賴場景下 Fun 為用戶內(nèi)置的資源函數(shù),可以將它理解為一個輔助函數(shù)。當用 Ros 方式部署時,將自動執(zhí)行輔助函數(shù)。它用于實現(xiàn)從 OSS 上下載大依賴(.zip)以及解壓到 Nas 的功能。這也就是為什么上述 fun pakckage 打包時,要將大依賴和代碼分離開并分別上傳到 OSS 的原因。

<a name="t4I4T"></a>

Fun Packge + Ros 部署實戰(zhàn)

Serverless 實戰(zhàn)——使用 Rendertron 搭建 Headless Chrome 渲染解決方案使用 Rendertron + 函數(shù)計算快速搭建一個可以直接用于生產(chǎn)的 Headless Chrome 渲染解決方案,以便于幫助網(wǎng)站更好的進行 SEO?;谖恼拢覀儗⑸壩恼轮?strong>一鍵部署的體驗。您可以參照上述文章中步驟,其中依賴安裝,項目編譯等均無需額外操作。

Rendertron 項目代碼依賴過大,基于 Fun 工具對大依賴項目的支持,現(xiàn)將其原 Fun deploy 部署改造為 Fun Packge + Ros 部署方式。Fun package 自動處理大依賴上傳到 OSS,Ros 部署將大依賴從 OSS 解壓到 Nas,同時模版中描述的資源自動創(chuàng)建成功?;诤瘮?shù)計算,項目的服務架構(gòu)如下:<br />開發(fā)函數(shù)計算的正確姿勢——輕松解決大依賴部署
<a name="ZXmNH"></a>

1. Fun pakcage

按照 RenderTron 文章中步驟操作,在一鍵部署前,執(zhí)行 fun package 命令:

fun package --oss-bucket aliyun-ellison

這里的 --oss-bucket 名稱為自己所擁有讀寫權(quán)限的 OSS 的 Bucket 名稱。完整日志如下:

開發(fā)函數(shù)計算的正確姿勢——輕松解決大依賴部署

<a name="pkGW8"></a>

2. Ros 部署

ROS 通過 Transform 宏實現(xiàn)了將函數(shù)計算的模板語法轉(zhuǎn)換為 ROS 支持的語法。這意味著對于?Fun 規(guī)范文檔?里描述的語法規(guī)則,ROS 是同樣支持的。同時,ROS 支持的資源?也能在 Fun 模板文件中進行聲明了,比如 RAM、函數(shù)工作流?等等。

在體驗上,由于 ROS 部署,要求資源必須“云化”。也就是沒辦法直接使用本地的代碼資源。必須先通過 fun package 命令將資源上傳到 oss。

可見這一步我們已經(jīng)完成,不管是大依賴場景還是非大依賴場景,fun package 打包完成后,后續(xù)的部署操作,只需要完全基于這個打包后的模板文件(template.packaged.yml)即可。不再依賴本地的代碼等資源,可以簡化部署的難度。

最后將資源通過 ROS 的方式進行部署,推薦閱讀開發(fā)函數(shù)計算的正確姿勢 —— 使用 ROS 進行資源編排。

fun deploy --use-ros --stack-name bucket-name

--stack-name 表示要部署的環(huán)境,可以基于該名稱的不同,建立多套開發(fā)環(huán)境,比如 test、staging、prod。

<a name="JRgPa"></a>

3. 驗證

可通過上述 RenderTron 文章中提到的方式驗證,這里不做贅述。

<a name="CAKEQ"></a>

常見問題梳理 FAQ

<a name="h6aa3"></a>

1. 大依賴被一個服務下的兩個函數(shù)同時引用,F(xiàn)un 是怎么處理的呢?

Fun 支持大依賴的場景是函數(shù)級別的,即當打包某一函數(shù)時發(fā)現(xiàn)超過限制才會進入向?qū)?。當兩個函數(shù)處于相同 runtime 和 codeUri,F(xiàn)un 會在結(jié)束第一次向?qū)r,同時自動配置第二個函數(shù),確保部署后,兩個函數(shù)都部署成功且可用。
<a name="Oamlf"></a>

2. 大依賴自動配置后,如果我本地添加了新的依賴,部署時會自動將依賴更新到 Nas 嗎?

不會。如果添加了新的依賴,比如 node_modules 目錄添加了新的依賴庫,需要在 template.yml 模版文件所在目錄執(zhí)行 fun nas sync,將本地 nas 資源同步到 nas 服務。如果修改了代碼,只需要使用 fun deploy 重新部署即可。由于大依賴和代碼通過 NAS 進行了分離,依賴通常不需要頻繁變化,所以調(diào)用的頻率比較低,而 fun deploy 的由于沒有了大依賴,部署速度也會非常的快。
<a name="RAvOJ"></a>

3. 為什么 java8 環(huán)境 Fun 支持大依賴的目錄是?.fun/build/artifacts?

在很多場景,編譯型語言從源碼距離交付物其實是有一定的距離,比如 java,寫完 java 代碼后,還要考慮如何編譯、打包的問題。Fun build 的職責就是完成從源碼到交付產(chǎn)物的構(gòu)建過程,推薦閱讀?《開發(fā)函數(shù)計算的正確姿勢 —— 使用 Fun Build 構(gòu)建函數(shù)》。<br />Fun build 會將編譯打包后的交付產(chǎn)物 copy 到?.fun/build/artifacts 目錄,在部署時檢測到代碼大小超過限制,自然會去?.fun/build/artifacts 下查找對應 serviceName/functionName 目錄,并將所有的 jar 包上傳到 Nas。所以 Fun 大依賴部署支持 java8 是以 Fun build 的場景為基礎。未來 Fun 會集成更多的解決方案,敬請期待!

總結(jié)

Fun 通過內(nèi)置 NAS(阿里云文件存儲)解決方案,可以一鍵幫用戶創(chuàng)建、配置 NAS,并上傳依賴到 NAS 上。而函數(shù)計算在運行時,可以自動從 NAS 讀取到函數(shù)依賴。同時也展現(xiàn) Fun 工具對大依賴場景的順滑體驗。

如果大家在使用 Fun 的過程中遇到了一些問題,可以在 github 上提 issue,或者加入我們的釘釘群 11721331 進行反饋。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI