本頁面提供外掛程式與 Cloud Load Balancing 應用程式負載平衡器和 Media CDN 整合的總覽資訊。
這項功能為 Media CDN 的預先發布版。
外掛程式是以 WebAssembly (Wasm) 格式建構,並使用 Proxy-Wasm API。
Wasm 是一種開放且標準化的二進位指令格式,可讓主機載入及執行 Wasm 模組,並使用客戶提供的程式碼。Wasm 在執行客戶程式碼方面有許多優點,包括沙箱機制可確保安全性、支援多種語言、可攜性、業界廣泛且日益增加的支援,以及相較於其他以虛擬機器 (VM) 為基礎的選項 (例如 JavaScript),效能有所提升。
Proxy-Wasm 是 Google 發起的開放原始碼專案,它定義了 API,可讓您透過實作回呼,在 HTTP 要求和回應處理期間執行,藉此自訂網路 Proxy 的行為。
外掛程式的運作方式
您可以搭配使用 Service Extensions 與應用程式負載平衡器和 Media CDN,如下所示:
按照下列步驟準備外掛程式程式碼:
建立外掛程式,並加入上傳的外掛程式程式碼。
在 Cloud Load Balancing 擴充功能或 Media CDN 擴充功能中設定外掛程式。
外掛程式資源
Service Extensions 可協助您建立下列重要資源,以便在處理路徑中新增自訂程式碼:
外掛程式:包含您要部署的自訂程式碼。
外掛程式版本:Wasm 模組的版本。您可以指定外掛程式要將哪個版本的 Wasm 模組做為主要 (有效) 模組。
存取外掛程式中的屬性
Wasm 外掛程式可以使用 proxy_get_property ABI 呼叫 (Proxy-Wasm ABI 的一部分) 存取轉送的屬性。可擷取的屬性名稱會對應至屬性名稱。
您可以將屬性名稱表示為路徑,藉此存取屬性。舉例來說,如要擷取 request.host,可以使用 {"request", "host"} 等路徑表示法。
以下 Rust 概念範例說明如何在 HttpContext 實作中存取轉送的屬性:
use proxy_wasm::traits::{HttpContext, RootContext}; use proxy_wasm::types::Action; // ... inside your HttpContext implementation ... fn on_request_headers(&mut self, _num_headers: usize, _end_of_stream: bool) -> Action { if let Some(host) = self.get_property(vec!["request", "host"]) { // host is a Vec, convert to string let host_str = String::from_utf8(host).unwrap_or_default(); log::info!("Request host: {}", host_str); } if let Some(region) = self.get_property(vec!["source", "client_region"]) { let region_str = String::from_utf8(region).unwrap_or_default(); log::info!("Client region: {}", region_str); } Action::Continue }
限制
本節列出外掛程式的一些限制。
資源限制
外掛程式可使用的資源數量受到嚴格限制:
外掛程式每次叫用最多可使用 1 毫秒的標準化 vCPU。CPU 毫秒會因平台而異,但標準化平台大約等同於時脈速度為 4 GHz 的處理器。叫用是獨立計費的執行階段,可以是要求標頭、要求主體、回應標頭或回應主體。
每個 VM 執行個體最多可使用 16 MiB 的外掛程式記憶體 (Media CDN 外掛程式為 4 MiB)。
執行個體必須能同時處理最多 1,000 個並行要求,也就是說,外掛程式最多可為每個串流保留 16 KiB 的記憶體 (媒體 CDN 外掛程式為 4 KiB)。記憶體總用量包括全域狀態和堆疊分配。超過這項限制的外掛程式會遭到終止。
建議您使用 C++ 和 Rust,因為這兩種語言產生的外掛程式記憶體用量最小。不建議將 Go SDK 用於 Media CDN,因為 Go 執行階段和垃圾收集器需要至少 2 至 3 MiB 的記憶體用量。
使用外掛程式測試工具,對外掛程式的 CPU 和記憶體特性進行基準測試。
API 限制
外掛程式可以使用 Proxy-Wasm ABI 的子集。外掛程式不支援計時器、自訂指標、共用資料、共用待播清單或傳出網路呼叫。
不支援 HTTP 結尾事件。
標頭操控限制
任何異動 (標頭或主體區塊) 的大小上限為 128 KiB。
外掛程式無法覆寫
ext_proc串流的處理模式。部分標頭不支援透過外掛程式操控標頭。處理器會忽略這些標頭中的任何修改,並繼續處理要求。
Media CDN 外掛程式不支援下列項目:
- 標頭:
CDN-Loop、connection、keep-alive、proxy-authenticate、proxy-authorization、proxy-connection、te、trailers、transfer-encoding、upgrade或X-user-IP。 - 開頭為
x-forwarded、x-goog-、x-google、x-gfe或x-amz-的標頭。
Cloud Load Balancing 外掛程式不支援下列項目:
標頭:
connection、keep-alive、proxy-authenticate、proxy-authorization、proxy-connection、sec-user-ip、te、trailer、transfer-encoding、upgrade、x-dont-count-ads、x-dont-show-ads、x-gr、x-proxyuser-ip或x-user-ip。此外,
LbTrafficExtension也不支援下列標頭:method、authority、scheme或主機標頭。開頭為
sec-gfe-、sec-google-、x-amz-、x-forwarded-、x-gfe-、x-goog-、x-google-或x-gproxy-的標頭。
- 標頭:
HTTP/1.1 用戶端和後端的限制
為擴充功能設定 REQUEST_BODY 或 RESPONSE_BODY 時,如果負載平衡器收到相符的要求,就會從回應中移除 Content-Length 標頭,並切換為分塊主體編碼。