在實現依靠Cloudflare提供高速、安全的內容分發服務的過程中,我們學會了如何使用 Cloudflare Workers 和 Workers KV 為靜態和動態內容提供優化的快取規則。
2023 年初,我們在 Cloudflare 快取管理方面加倍努力,使快取對客戶端配置更改的響應速度更快,同時將廣播功能更新的重任從後臺管理員手中轉移到 Cloudflare Workers。一個重要成果是成功快取的客戶資料份額大幅增加,在 2022 年 10 月至 2023 年 3 月期間增加了 56.3%。
通過 Cloudflare Workers 進行的優化成效
Cloudflare Workers 和 Workers KV 允許我們以最小的工作量和更低的延遲對每個請求和響應進行程式設計定製。當我們要實施新功能時,不再需要將更改部署到成百上千的容器中;我們可以使用 Workers 複製或實施該功能,只需幾個命令和點選即可將其部署到各個地方,從而節省了數天的工作和維護時間。
使用Workers KV和Workers請求路由
每個域都是一個鍵,其值至少包含核心設定(如源 IP 和埠)和一個唯一的隨機 ID。有了 Workers KV 中的這些資料,我們就可以使用 Workers 來分析、處理請求,並將請求路由到預期的後端。我們還使用 Workers KV 來儲存客戶優化選項,如拋光、影象大小調整和自動最小化。
要將請求路由到自定義 IP 和埠,我們使用特定於 Cloudflare 的請求屬性 resolveOverride。下面是一個示例:
// Assign KV values to variables const { customBackend } = kvdata.kinstaConf; // Override the backend cf.resolveOverride = customBackend;
然而,雖然 Workers KV 可以很好地路由請求,但我們很快就發現快取中的響應不一致。有時,客戶啟用了波蘭語,由於 Workers KV 的一分鐘快取,新請求在 Workers KV 完全傳播更改之前就已到達,導致我們快取了未優化的資產。發生這種情況時,客戶不得不再次手動清除快取。這種情況並不理想。客戶感到沮喪,而我們則浪費了 API 操作和 GCP 頻寬,不斷清除快取。
快取鍵是關鍵
由於我們總是讀取域的 Workers KV 資料,我們意識到我們可以路由請求並自定義快取金鑰,新增域的 ID 和可能影響資產的功能(如波蘭語)。如今,我們的快取金鑰經過了大量定製,可以快速反映面板或 API 中的每一個客戶變化。通過使用 Workers KV 的資料修改快取金鑰,再也不用擔心清除快取的問題了。一旦 Workers KV 傳播了更改,快取金鑰也會隨之更改,我們就會請求並快取新的資產。
自定義快取金鑰的最簡單方法是向其新增 query params
。例如:
let cacheKey = `${request.url}?custom-cache-param-polish=lossy`
當然,您需要檢查 URL 中的現有引數,以確定使用哪個聯結器( ?
或 &
),並確保您使用的是唯一識別符號。
然後,您就可以使用這個新的快取金鑰,通過快取 API 或 Fetch(或兩者)儲存響應。
Workers KV快取
Workers KV 操作費用低廉,但如果每天觸發數十億次讀取操作,數字就會堆積如山。
由於我們對快取金鑰進行了定製,我們意識到可以通過快取 API 來快取 Workers KV 資料,從而節省讀取操作,並可能通過避免每個訪問者多次 Workers KV GET 請求來降低延遲。由於快取響應現在是基於請求的 URL 和 KV 資料,我們不再需要擔心快取過期內容。
包括快取 Workers KV 資料的流程。
在各種快取情況下,到第一個位元組的平均時間。
然而,與許多應用程式不同,我們無法長時間快取 Workers KV。Kinsta 的客戶不斷嘗試新功能,更改波蘭語和自動最小化設定,有時會將頁面或擴充套件排除在快取之外,他們希望儘快在生產中看到自己的更改。
因此,我們決定對我們的 Workers KV 資料進行微快取–在很短的時間內(通常少於 60 秒)快取動態或不斷變化的內容。
實現自己的 Workers KV 快取邏輯非常簡單。例如:
const handleKVCache = async (event, myCustomDomain) => { // Try to get KV from cache first const cache = caches.default; let site_data = await cache.match( `https://${myCustomDomain}/some-string-ID-kv-data/` ); // Valid KV cache match if (site_data && site_data.status === 200) { // ... modify your cached data if necessary, then return it return site_data; } // Invalid cache (expired, miss, etc), get data from KV namespace site_data = await KV_NAMESPACE.get(myCustomDomain.toLowerCase()); // Cache valid KV responses with Cache API if (site_data) { let kvResponse = new Response(JSON.stringify(site_data), {status: 200}); kvResponse.headers.set("Cache-Control", "public, s-maxage=30"); event.waitUntil(cache.put(`https://${myCustomDomain}/some-string-ID-kv-data/`, kvResponse)); } return site_data; };
(也可以使用 FlareUtils 的 BetterKV)。
下圖為 Workers KV 資料實施了 30 秒的快取 TTL,將讀取操作減少了約 80%。
為 Workers KV 資料快取設定 30 秒 TTL 後,讀取操作量減少。
學習更多
想了解有關 Workers 和 Workers KV 的更多資訊?請檢視 Cloudflare Workers KV 開發文件,或訪問 Cloudflare 專門的 Workers KV 主頁。
評論留言