產品概述
騰訊云無服務器云函數(shù)(Serverless Cloud Function,SCF)是騰訊云為企業(yè)和開發(fā)者們提供的無服務器執(zhí)行環(huán)境,幫助您在無需購買和管理服務器的情況下運行代碼。您只需使用平臺支持的語言編寫核心代碼并設置代碼運行的條件,即可在騰訊云基礎設施上彈性、安全地運行代碼。SCF 是實時文件處理和數(shù)據(jù)處理等場景下理想的計算平臺。
計算資源的變遷
隨著云服務的發(fā)展,計算資源高度抽象化,騰訊云提供了從物理服務器到云函數(shù)的、橫跨各種抽象程度的計算資源供用戶選擇。
- 黑石物理服務器:以物理機為擴展單位。用戶完全擁有整臺實體計算資源,安全性最好。
- 云服務器:以云服務器為擴展單位,虛擬化硬件設備。用戶和其他租戶共享物理機資源,仍可自行配置 CVM 的各項指標,相對部署和迭代更加簡單。
- 容器:以服務為擴展單位,虛擬化操作系統(tǒng)。測試和生產環(huán)境完全一致,測試和部署非常輕松。
- 無服務器云函數(shù):以函數(shù)為擴展單位,虛擬化運行時環(huán)境(Runtime)。是現(xiàn)有計算資源的最小單位,具有完全自動、一鍵部署、高度可擴展等特點,是輕量級服務部署非常好的選擇。
什么是無服務器 Serverless
Serverless 并不代表沒有了服務器,只是用戶不再需要關心這些底層資源了。當然,這也意味著用戶無法登錄服務器,并且也不需要想辦法優(yōu)化它。開發(fā)者只需關心最核心的代碼片段,跳過復雜的、無聊的其他工作。這些代碼完全由事件觸發(fā)(event-trigger),平臺根據(jù)請求自動平行調整服務資源,擁有近乎無限的擴容能力,空閑時則沒有任何資源在運行。代碼運行無狀態(tài),可以輕易實現(xiàn)快速迭代、極速部署。
騰訊云無服務器云函數(shù)簡介
騰訊云云函數(shù)是騰訊云提供的無服務器(Serverless)執(zhí)行環(huán)境。您只需編寫簡單的、目的單一的云函數(shù),并將它與您的騰訊云基礎設施及其他云服務產生的事件關聯(lián)起來。
使用云函數(shù)時,用戶只需關注自己的代碼。騰訊云完全管理底層計算資源,包括服務器 CPU、內存、網絡和其他配置/資源維護、代碼部署、彈性伸縮、負載均衡、安全升級、資源運行情況監(jiān)控等,用戶只需使用平臺支持的語言(目前支持 Python,Nodejs,Java)提供代碼。同時,這意味著您無法登錄或管理服務器、無法自定義系統(tǒng)和環(huán)境。
代碼在執(zhí)行時將根據(jù)請求負載擴縮容,無需人工配置和介入即可滿足不同情景下服務的可用性和穩(wěn)定性,從每天幾個請求到每秒數(shù)千個請求,都由云函數(shù)底層自行伸縮。云函數(shù)自動地在地域內的多個可用區(qū)部署,提供極高的容錯性。用戶只需為運行中的云函數(shù)付費,代碼未運行時不產生任何費用。
您可以自定義何時運行您的代碼,比如在 COS Bucket 上傳或刪除了文件時、應用程序通過 SDK 調用了代碼時,或自行指定代碼定期執(zhí)行。因此,您可以使用云函數(shù)作為 COS 服務的數(shù)據(jù)處理觸發(fā)程序,輕松實現(xiàn) IFTTT 邏輯。也可構建靈活的定時自動化任務來覆蓋手工完成的操作,輕松構建靈活可控的軟件架構。
如果用戶需要管理您的計算資源,騰訊云還為您提供以下計算服務:
- 云服務器 提供各種規(guī)格的實例配置,您可以自定義計算資源的 CPU、內存、操作系統(tǒng)、網絡、安全等各項配置,但您需要自定義策略完成跨可用區(qū)容錯、資源伸縮等。
- 容器服務 提供高度可擴展的容器管理服務,您可以根據(jù)資源需求和可用性要求在您的集群中安排容器,滿足業(yè)務或應用程序的特定要求。
騰訊云無服務器云函數(shù)(Serverless Cloud Function,SCF)為函數(shù)即服務 (Function as a Service,F(xiàn)aaS)產品,提供無服務器(Serverless) 和 FaaS 的計算平臺。運行方式依賴事件觸發(fā)。因此在和觸發(fā)事件源結合時,云函數(shù)就可以被觸發(fā)源所產生的事件觸發(fā)運行。
相關概念
無服務器
無服務器架構說法的來源可以根據(jù) Mike Roberts 在 Martin Fowler 的博客網站上發(fā)表的 無服務器架構 一文中得到解釋。
無服務器并不是沒有服務器就能夠進行計算,而是對于開發(fā)者來說,無需了解底層的服務器情況,也能使用到相關資源,因此稱為無服務器。
無服務器也可以從更廣的角度來識別,針對無需配置和了解底層的服務器就可以直接使用的云服務,在一定程度上也可以稱為無服務器。
在無服務器云函數(shù) SCF 產品中,我們針對的是無服務器場景中的計算場景。云函數(shù)產品提供的是無服務器模式下的 FaaS 能力。
函數(shù)即服務
函數(shù)即服務提供了一種直接在云上運行無狀態(tài)的、短暫的、由事件觸發(fā)的代碼的能力。
函數(shù)即服務和傳統(tǒng)應用架構不同,函數(shù)服務提供的是事件觸發(fā)式的運行方式,云函數(shù)不是始終運行的狀態(tài),而是在事件發(fā)生時由事件觸發(fā)運行,并且在一次運行的過程中處理這一次事件。因此在云函數(shù)的代碼中,僅需考慮針對一個事件的處理流程,而針對大量事件的高并發(fā)處理,由平臺實現(xiàn)云函數(shù)的多實例并發(fā)來支持。
為了實現(xiàn)對高并發(fā)的支持,云函數(shù)平臺提供了自動的彈性伸縮能力,會在有大量請求到來時啟動更多實例來處理事件請求,也會在沒有事件到來時縮減函數(shù)實例甚至到零實例。因此為了匹配自動擴縮能力,需要函數(shù)代碼使用的是無狀態(tài)開發(fā)方式,即不在云函數(shù)的運行內存中保留相關的狀態(tài)數(shù)據(jù)并在多次運行時依賴這些狀態(tài)數(shù)據(jù)。云函數(shù)的狀態(tài)數(shù)據(jù),可以依賴外部的持久存儲能力例如云緩存、云數(shù)據(jù)庫、云存儲來進行。
觸發(fā)器和觸發(fā)源
任何可以產生事件,觸發(fā)云函數(shù)執(zhí)行的均可以被稱為觸發(fā)器或觸發(fā)源。觸發(fā)器在本身產生事件后,通過將事件傳遞給云函數(shù)來觸發(fā)函數(shù)運行。
觸發(fā)器在觸發(fā)函數(shù)時,可以根據(jù)自身特點,使用同步或異步方式觸發(fā)函數(shù)。同步方式觸發(fā)函數(shù)時,觸發(fā)器將等待函數(shù)執(zhí)行完成并獲取到函數(shù)執(zhí)行結果;異步方式觸發(fā)函數(shù)時,觸發(fā)器將僅觸發(fā)函數(shù)而忽略函數(shù)執(zhí)行結果。
騰訊云無服務器云函數(shù)在和騰訊云的某些產品或服務對接時,也有自身實現(xiàn)的一些特殊方式,例如推(PUSH)模式和拉(PULL)模式。
- 推模式:觸發(fā)器主動將事件推送至云函數(shù)平臺并觸發(fā)函數(shù)運行。
- 拉模式:云函數(shù)平臺通過拉取模塊,從觸發(fā)器中拉取到事件并觸發(fā)云函數(shù)運行。
觸發(fā)事件
觸發(fā)器在觸發(fā)函數(shù)時會將事件傳遞給云函數(shù)。事件在傳遞時以一個特定的數(shù)據(jù)結構體現(xiàn),數(shù)據(jù)結構格式在傳遞時均為 JSON 格式,并以函數(shù) event 入參的方式傳遞給云函數(shù)。
觸發(fā)事件的 JSON 數(shù)據(jù)內容,在不同的語言環(huán)境下將會轉換為各自語言的數(shù)據(jù)結構或對象,無需在代碼中自行進行從 JSON 結構到數(shù)據(jù)結構的轉換。
例如,在 Python 環(huán)境中,JSON 數(shù)據(jù)內容會轉變?yōu)橐粋€復雜 dict 對象,即函數(shù)的入參 event 就是一個 Python 的復雜 dict 對象。而在 Golang 或 Java 中,入參是一個需要和 event 數(shù)據(jù)結構可以匹配的對象。更具體的實現(xiàn)方式可以見 開發(fā)語言說明。
工作原理
函數(shù)運行時的容器模型
SCF 將在事件觸發(fā)時代表您執(zhí)行 SCF 函數(shù),根據(jù)您的配置信息(如內存大小等)進行資源分配,并啟動和管理容器(即函數(shù)的執(zhí)行環(huán)境)。SCF 平臺負責所有函數(shù)運行容器的創(chuàng)建、管理和刪除清理操作,用戶沒有權限對其進行管理。
在容器啟動時需要一些時間,這會使得每次調用函數(shù)時增加一些延遲。但是,通常僅在首次調用函數(shù)、更新函數(shù)、或長時間未調用時重新調用時會察覺到此延遲,因為平臺為了盡量減少此啟動延時,會嘗試對后續(xù)調用重用容器,在調用函數(shù)后容器仍會存留一段時間,預期用于下次調用。在此段時間內的調用會直接重用該存留的容器。
容器重用機制的意義在于:
- 用戶代碼中位于 執(zhí)行方法 外部的任何聲明保持已初始化的狀態(tài),再次調用函數(shù)時可以直接重用。例如,如果您的函數(shù)代碼中建立了數(shù)據(jù)庫連接,容器重用時可以直接使用原始連接。您可以在代碼中添加邏輯,在創(chuàng)建新連接之前檢查是否已存在連接。
- 每個容器在
/tmp目錄中提供部分磁盤空間。容器存留時該目錄內容會保留,提供可用于多次調用的暫時性緩存。再次調用函數(shù)時有可能可以直接使用該磁盤內容,您可以添加額外的代碼來檢查緩存中是否有您存儲的數(shù)據(jù)。
注意:
請勿在函數(shù)代碼中假定始終重用容器,因為是否重用和單次實際調用相關,無法保證是創(chuàng)建新容器還是重用現(xiàn)有容器。
臨時磁盤空間
SCF 函數(shù)在執(zhí)行過程中,都擁有一塊 512MB 的臨時磁盤空間 /tmp,用戶可以在執(zhí)行代碼中對該空間進行一些讀寫操作,但這部分數(shù)據(jù)可能 不會 在函數(shù)執(zhí)行完成后保留。因此,如果您需要對執(zhí)行過程中產生的數(shù)據(jù)進行持久化存儲,請使用 COS 或 Redis/Memcached 等外部持久化存儲。
調用類型
SCF 平臺支持同步和異步兩種調用方式來調用云函數(shù)。調用類型與函數(shù)本身的配置無關,只有在調用函數(shù)時才能控制調用類型。
- 同步調用函數(shù)將會在調用請求發(fā)出后持續(xù)等待函數(shù)的執(zhí)行結果返回
- 異步調用將不會等待結果返回,只發(fā)出請求并獲得當前請求的 Request ID。
以下調用場景您可以自由定義函數(shù)的調用類型:
- 編寫的應用程序調用 SCF 函數(shù)。如果您需要同步調用,請在 InvokeFunction 接口中傳入參數(shù)
invokeType=RequestResponse;如果您需要異步調用則請傳入參數(shù)invokeType=Event。 - 手動調用 SCF 函數(shù)(使用 API 或 CLI)用于測試。調用時的參數(shù)區(qū)別同上。
但是,在您使用騰訊云其他云服務作為事件源時,云服務的調用類型是預定義的,用戶無法在這種情況下自由指定調用類型。例如,COS 和定時器始終異步調用 SCF 函數(shù)。
用戶限制
函數(shù)相關的使用配額及相關環(huán)境限制,可見 配額及限制。
函數(shù)并發(fā)量
函數(shù)的并發(fā)數(shù)量是指在任意指定時間對函數(shù)代碼的執(zhí)行數(shù)量。對于當前的 SCF 函數(shù)來說,每個發(fā)布的事件請求就會執(zhí)行一次。因此,這些觸發(fā)器發(fā)布的事件數(shù)(即請求量)會影響函數(shù)的并發(fā)數(shù)。您可以使用以下公式來估算并發(fā)的函數(shù)實例總數(shù)目。
- [](javascript: void 0;)
每秒請求量 * 函數(shù)執(zhí)行時間(按秒)
例如,考慮一個處理 COS 事件的函數(shù),假定函數(shù)平均用時0.2秒(即200毫秒),COS 每秒發(fā)布300個請求至函數(shù)。這樣將同時生產 300 * 0.2 = 60 個函數(shù)實例。
并發(fā)限制
當前默認情況下,SCF 對每個函數(shù)的并發(fā)量有一定限制,您可以通過查看 配額及限制 了解當前函數(shù)的并發(fā)量限制。您可以通過 聯(lián)系我們 來調高此數(shù)值。
如果調用導致函數(shù)的并發(fā)數(shù)目超過了默認限制,則該調用會被阻塞,SCF 將不會執(zhí)行這次調用。根據(jù)函數(shù)的調用方式,受限制的調用的處理方式會有所不同:
- 同步調用:如果函數(shù)被同步調用時受到限制,將會直接返回429錯誤。
- 異步調用:如果函數(shù)被異步調用時受到限制,SCF 將在一定的時間內以固定的頻率自動重試受限制的事件。
重試機制
如果您的函數(shù)因為超過最大并發(fā)數(shù)目、或遇到平臺內部資源不足等內部限制導致失敗。此時,如果您的函數(shù)被同步調用,將會直接返回錯誤(見上面并發(fā)執(zhí)行限制內容)。如果您的函數(shù)被內部云服務使用異步方式調用,則該次調用將會自動進入一個重試隊列,SCF 將自動重試調用。
執(zhí)行環(huán)境和可用庫
當前 SCF 的執(zhí)行環(huán)境建立在以下基礎上:
- 標準 CentOS 7.2
如果需要在代碼中包含可執(zhí)行的二進制文件、動態(tài)庫或靜態(tài)庫,請都確保兼容此執(zhí)行環(huán)境。
基于不同語言環(huán)境,在 SCF 執(zhí)行環(huán)境下有相關語言的基礎庫及安裝的附加庫,您可以在各個語言說明中查看環(huán)境中已安裝的附加庫: