Cloud Functions 執行環境
Cloud Run 函式會在 Google 處理基礎架構、作業系統和執行階段環境的全代管無伺服器環境中執行。每個函式都會在各自的隔離安全執行情境中執行,自動調整規模,且生命週期與其他函式無關。
執行階段
Cloud Run 函式支援多種語言的執行階段。每個版本都包含一組標準的系統套件,以及該語言所需的工具和程式庫。如果您要透過指令列或Terraform部署函式,就需要執行階段 ID 值。
安全性和維護更新可供所有第 1 和第 2 代執行環境使用。這些更新會自動或手動套用,取決於環境和您設定的方式。如要進一步瞭解執行環境更新,請參閱「保護 Cloud Run 函式」。
Node.js
執行階段 | 產生 | 環境 | 執行階段 ID | 執行階段映像檔 |
---|---|---|---|---|
Node.js 22 | 第 2 代 | Ubuntu 22.04 | nodejs22 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/nodejs22 |
Node.js 20 | 第 1 代、第 2 代 | Ubuntu 22.04 | nodejs20 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/nodejs20 |
Node.js 18 | 第 1 代、第 2 代 | Ubuntu 22.04 | nodejs18 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/nodejs18 |
Node.js 16 | 第 1 代、第 2 代 | Ubuntu 18.04 | nodejs16 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/nodejs16 |
Node.js 14 | 第 1 代、第 2 代 | Ubuntu 18.04 | nodejs14 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/nodejs14 |
Node.js 12 | 第 1 代、第 2 代 | Ubuntu 18.04 | nodejs12 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/nodejs12 |
Node.js 10 | 第 1 代、第 2 代 | Ubuntu 18.04 | nodejs10 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/nodejs10 |
Node.js 8 | 第 1 代、第 2 代 | Ubuntu 18.04 | nodejs8 | 已停用 |
Node.js 6 | 第 1 代、第 2 代 | Ubuntu 18.04 | nodejs6 | 已停用 |
Python
執行階段 | 產生 | 環境 | 執行階段 ID | 執行階段映像檔 |
---|---|---|---|---|
Python 3.13 | 第 2 代 | Ubuntu 22.04 | python313 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/python313 |
Python 3.12 | 第 1 代、第 2 代 | Ubuntu 22.04 | python312 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/python312 |
Python 3.11 | 第 1 代、第 2 代 | Ubuntu 22.04 | python311 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/python311 |
Python 3.10 | 第 1 代、第 2 代 | Ubuntu 22.04 | python310 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/python310 |
Python 3.9 | 第 1 代、第 2 代 | Ubuntu 18.04 | python39 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/python39 |
Python 3.8 | 第 1 代、第 2 代 | Ubuntu 18.04 | python38 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/python38 |
Python 3.7 | 第 1 代 | Ubuntu 18.04 | python37 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/python37 |
Go
執行階段 | 產生 | 環境 | 執行階段 ID | 執行階段映像檔 |
---|---|---|---|---|
Go 1.23 | 第 2 代 | Ubuntu 22.04 | go123 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/go123 |
Go 1.22 | 第 2 代 | Ubuntu 22.04 | go122 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/go122 |
Go 1.21 | 第 1 代、第 2 代 | Ubuntu 22.04 | go121 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/go121 |
Go 1.20 | 第 1 代、第 2 代 | Ubuntu 22.04 | go120 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/go120 |
Go 1.19 | 第 1 代、第 2 代 | Ubuntu 22.04 | go119 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/go119 |
Go 1.18 | 第 1 代、第 2 代 | Ubuntu 22.04 | go118 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/go118 |
Go 1.16 | 第 1 代、第 2 代 | Ubuntu 18.04 | go116 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/go116 |
Go 1.13 | 第 1 代、第 2 代 | Ubuntu 18.04 | go113 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/go113 |
Go 1.11 | 第 1 代、第 2 代 | Ubuntu 18.04 | go111 | 已停用 |
Java
執行階段 | 產生 | 環境 | 執行階段 ID | 執行階段映像檔 |
---|---|---|---|---|
Java 21 | 第 2 代 | Ubuntu 22.04 | java21 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/java21 |
Java 17 | 第 1 代、第 2 代 | Ubuntu 22.04 | java17 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/java17 |
Java 11 | 第 1 代、第 2 代 | Ubuntu 18.04 | java11 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/java11 |
Ruby
執行階段 | 產生 | 環境 | 執行階段 ID | 執行階段映像檔 |
---|---|---|---|---|
Ruby 3.4 | 第 2 代 | Ubuntu 22.04 | ruby34 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/ruby34 |
Ruby 3.3 | 第 1 代、第 2 代 | Ubuntu 22.04 | ruby33 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/ruby33 |
Ruby 3.2 | 第 1 代、第 2 代 | Ubuntu 22.04 | ruby32 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/ruby32 |
Ruby 3.0 | 第 1 代、第 2 代 | Ubuntu 18.04 | ruby30 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/ruby30 |
Ruby 2.7 | 第 1 代、第 2 代 | Ubuntu 18.04 | ruby27 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/ruby27 |
Ruby 2.6 | 第 1 代、第 2 代 | Ubuntu 18.04 | ruby26 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/ruby26 |
PHP
執行階段 | 環境 | 產生 | 執行階段 ID | 執行階段映像檔 |
---|---|---|---|---|
PHP 8.4 | 第 2 代 | Ubuntu 22.04 | php84 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/php84 |
PHP 8.3 | 第 2 代 | Ubuntu 22.04 | php83 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/php83 |
PHP 8.2 | 第 1 代、第 2 代 | Ubuntu 22.04 | php82 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/php82 |
PHP 8.1 | 第 1 代、第 2 代 | Ubuntu 18.04 | php81 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/php81 |
PHP 7.4 | 第 1 代、第 2 代 | Ubuntu 18.04 | php74 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/php74 |
.NET Core
執行階段 | 產生 | 環境 | 執行階段 ID | 執行階段映像檔 |
---|---|---|---|---|
.NET Core 8 | 第 2 代 | Ubuntu 22.04 | dotnet8 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/dotnet8 |
.NET Core 6 | 第 1 代、第 2 代 | Ubuntu 22.04 | dotnet6 | us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/dotnet6 |
.NET Core 3 | 第 1 代、第 2 代 | Ubuntu 18.04 | dotnet3 | us-central1-docker.pkg.dev/serverless-runtimes/google-18-full/runtimes/dotnet3 |
自動調整資源配置行為
Cloud Run 函式會實作無伺服器架構,讓您執行程式碼時不必擔心基礎架構 (例如伺服器或虛擬機器)。部署完畢後,系統會自動管理及調整函式。
Cloud Run 函式會將傳入要求指派給函式的執行個體,以便處理這些要求。視要求量和現有函式執行個體的數量而定,Cloud Run 函式可能會將要求指派給現有執行個體,或建立新的執行個體。
如果傳入要求的數量超過現有執行個體的數量,Cloud Run 函式可能會啟動多個新執行個體來處理要求。這種自動調整資源配置行為可讓 Cloud Run 函式並行處理多個要求,每個要求都使用函式的不同執行個體。
在某些情況下,無限擴充可能不是理想的做法。為解決這個問題,Cloud Run 函式可讓您設定執行個體數量上限,以便在任何特定時間點同時執行特定函式。
無狀態
如要啟用函式的自動管理和調整功能,函式必須是無狀態的,也就是說,一個函式叫用不得依賴先前叫用所設定的記憶體內狀態。呼叫可能由不同的函式例項處理,這些例項不會共用全域變數、記憶體、檔案系統或其他狀態。
如果您需要在函式呼叫之間共用狀態,函式應使用 Memorystore、Datastore、Firestore 或 Cloud Storage 等服務來儲存資料。如要進一步瞭解 Google Cloud提供的資料庫和儲存空間選項,請參閱「Google Cloud 資料庫」和「Google Cloud 儲存空間產品」。
並行
Cloud Run 函式 (第 2 代)
Cloud Run 函式 (第 2 代) 可在單一函式執行個體上處理多個並行要求。這有助於避免冷啟動,因為已暖機的執行個體可以同時處理多個要求,進而縮短整體延遲時間。詳情請參閱「並行性」。
Cloud Run functions (第 1 代)
在 Cloud Run 函式 (第 1 代) 中,每個函式執行個體一次只能處理一個並行要求。也就是說,當程式碼處理一個要求時,第二個要求就無法導向相同的例項。因此,原始要求可以使用您分配的所有資源 (記憶體和 CPU)。
由於 Cloud Run 函式 (第 1 代) 中的並發要求是由不同的函式執行個體處理,因此不會共用變數或本機記憶體。詳情請參閱「無狀態」和「函式執行個體生命週期」。
冷啟動
新函式執行個體會在下列兩種情況啟動:
當您部署函式時。
系統會自動建立新函式執行個體,以便擴大負載,或偶爾取代現有執行個體。
啟動新的函式執行個體時,系統會載入執行階段和程式碼。包含函式執行個體啟動作業的請求 (稱為「冷啟動」),可能比傳送至現有函式執行個體的請求速度慢。不過,如果函式收到穩定的負載,冷啟動次數通常會微乎其微,除非函式經常當機,需要重新啟動函式環境。
如果函式程式碼擲回未偵測到的例外狀況,或導致目前程序異常終止,函式執行個體可能會重新啟動。這可能會導致更多冷啟動,導致延遲時間增加,因此建議您擷取例外狀況,並避免終止目前的程序。
如果函式對延遲時間很敏感,建議您設定執行個體數量下限,以免發生冷啟動。
函式執行個體的生命週期
函式執行個體通常具有復原能力,並可供後續函式呼叫重複使用,除非因缺乏持續流量或函式異常終止,才會縮減執行個體數量。也就是說,當某個函式執行作業結束時,另一個函式叫用作業可以由同一個函式執行個體處理。
函式範圍與全域範圍
單一函式叫用只會執行宣告為進入點的函式主體。函式來源程式碼的全域範圍只會在冷啟動時執行,不會在已初始化的例項上執行。
Node.js
Python
Go
Java
Ruby
您可以使用全域變數來提升效能,但請勿依賴先前函式呼叫在全域範圍中設定的狀態。詳情請參閱「無狀態」。
您可以假設,對於每個函式執行個體,在函式程式碼叫用之前,全域範圍已執行了一次。不過,請勿依賴全域範圍執行作業的總數或時間,因為這可能會因自動調整活動而有所不同。
函式執行時間軸
函式只能在執行期間存取已分配的資源 (記憶體和 CPU)。在執行期間以外執行的程式碼不保證會執行,而且隨時可以停止執行。因此,您應一律正確地發出函式執行結束信號,並避免執行任何超出範圍的程式碼。如需相關指引,請參閱 HTTP 函式、背景函式和 CloudEvent 函式。
函式執行作業也受函式逾時時間長度限制。詳情請參閱「函式逾時」。
在初始化應用程式時,請考量執行時程。在初始化期間,請勿在全域範圍內建立背景工作,因為背景工作會在要求的時間範圍外執行。
執行保證
通常會針對每個連入事件叫用一次函式。不過,由於錯誤情況各有不同,Cloud Run 函式無法保證在所有情況下都會單一叫用。
函式在單一事件中可叫用的最大或最小次數,取決於函式類型:
HTTP 函式「最多」會叫用一次。這是因為 HTTP 呼叫具有同步性,也就是說,在函式叫用期間發生的任何錯誤都會傳回,而不會重試。HTTP 函式的呼叫端應處理錯誤,並視需要重試。
事件驅動函式會至少叫用一次。這是因為事件具有非同步性,因此沒有任何呼叫端會等待回應。在極少數情況下,系統可能會多次叫用事件驅動函式,以確保事件傳送。如果事件驅動函式叫用失敗並發生錯誤,除非為該函式啟用失敗時重試,否則系統不會再次叫用該函式。
為確保函式在重試執行時能正確運作,您應將其實作為冪等,這樣即使事件傳送多次,也能產生預期的結果 (和附帶影響)。在 HTTP 函式的情況下,這也表示即使呼叫端重試對 HTTP 函式端點的呼叫,也會傳回所需值。如要進一步瞭解如何讓函式具備冪等性,請參閱「重試事件驅動函式」。
記憶體和檔案系統
每個函式都會分配一定量的記憶體供其使用。您可以在部署時設定記憶體容量。詳情請參閱「設定記憶體」一文。
函式執行環境包含一個記憶體內的檔案系統,其中包含與函式一併部署的原始檔案和目錄 (請參閱「結構化原始碼」)。包含來源檔案的目錄為唯讀,但檔案系統的其餘部分可寫入 (作業系統使用的檔案除外)。使用檔案系統會計入函式的記憶體用量。
函式可以使用各程式設計語言的標準方法與檔案系統互動。
網路
您的函式可以使用各程式設計語言的標準方法存取公開網際網路,無論是透過執行階段提供的內建程式庫,還是您納入為依附元件的第三方程式庫,皆可存取。
嘗試在函式叫用期間重複使用網路連線。不過,請注意,如果連線 10 分鐘未使用,系統可能會關閉連線,而如果之後嘗試使用已關閉的連線,則會發生「連線重設」錯誤。您的程式碼應使用程式庫來很好地處理關閉的連線,或在使用低層級網路結構的情況下,明確處理這些連線。
函式隔離
每個部署的函式都會與其他所有函式隔離開,就算是從相同來源檔案部署的函式也是如此。特別是,它們不會共用記憶體、全域變數、檔案系統或其他狀態。
如要在已部署的函式之間共用資料,您可以使用 Memorystore、Datastore、Firestore 或 Cloud Storage 等服務。或者,您也可以使用適當的觸發事件,從一個函式叫用另一個函式,並傳遞必要資料。例如,向 HTTP 函式的端點提出 HTTP 要求,或將訊息發布至 Pub/Sub 主題,藉此觸發 Pub/Sub 函式。