概觀

A/B 測試或金絲雀部署技術可讓開發人員試驗網頁的兩個或多個變體。變體會隨機向使用者顯示,然後運用統計分析針對特定業務目標來判斷哪個變體的績效更好。例如,以提高產品銷售為目標,可以測試產品頁面的 UI 變體。

架構決策

您可根據技術與業務需求以不同方式實作 A/B 測試。主要技術決策之一是在哪裡執行變體選擇邏輯:在用戶端、在邊緣伺服器端 (在 CDN 層級) 還是在原始伺服器端。

原始伺服器端變體選擇。若採用此方法,A/B 選擇會直接在託管 Web 應用程式的原始伺服器執行。儘管此方法與 CDN 無關,但其與 CDN 快取或靜態檔案託管不相容。此選項用於完全動態的伺服器端呈現 Web 應用程式。

邊緣伺服器端變體選擇。若採用此方法,您可在 CDN 層級做出變體選擇決定。此方法僅需應用程式做出最少變更或不需任何變更,且與 CDN 快取相容。您可在 CloudFront 利用邊緣函數實作 A/B 測試邏輯。除外部 A/B 測試 API 外,邊緣函數還可利用請求屬性 (國家/地區、Cookie 等) 來選取其中一個變體,並讓 CloudFront 從快取加以提供。

用戶端變體選擇。若採用此方法,您的前端首先向 A/B 測試 API 提出請求,決定要提供哪個變體,然後根據回應下載變體,並在瀏覽器呈現。在這種方法中,您的 A/B 測試與 CDN 無關,但其與應用程式緊密耦合,並由於客戶端的額外步驟而導致額外延遲。另請注意,此選項並非隨時可用,例如用於 A/B 測試靜態生成的網站 (SSG)。若要實作用戶端 A/B 測試,您可採用 CloudWatch Evidently。其提供用戶端 SDK 與 UI 來控制 A/B 測試實驗。如需有關 CloudWatch Evidently 的實作教學,可查看此研討會。

讓我們聚焦邊緣伺服器端 A/B 測試。若要為您的企業設計最佳實作,請考慮其他問題:

  • 您是否需要黏性 (例如,同一使用者將一律獲得相同變體)? 黏性通常利用 Cookie 來實作。
  • 採用哪些維度來為使用者選取變體?國家/地區、用戶 ID 等等。
  • 您進行 A/B 測試的頻率為何? 相較於較簡單且偶爾執行的 A/B 測試,大量運用 A/B 測試,並由不同團隊並行執行許多實驗需要更複雜的實作。

若要了解如何運用 CloudFront 邊緣函數來實作部分邊緣服務端 A/B 測試,請考慮此工作坊的實作教學。在下一節,我們將從上述工作坊分享運用 CloudFront 執行 A/B 測試的兩種常見實作。

運用邊緣伺服器端 A/B 測試的常見使用案例

偶爾的 A/B 測試

針對偶爾的 A/B 測試需求,例如機構網站的季度設計改進,請在實驗期間考慮採用以 CloudFront Functions 為基礎的解決方案。該解決方案以在快取行為上設定的兩個函數為基礎,與您想要執行 A/B 測試的頁面相符:

  • 檢視器請求函數,這可檢查傳入請求的實驗 Cookie 值,並在其基礎上將 URL 重新寫入選取的頁面變體。如果 Cookie 不存在,則該函數會使用您的自訂邏輯來選取變體,例如對於來自法國的請求,變體 A 為 60%,而變體 B 為 40%。
  • 檢視器回應函數,如果 Cookie 尚未存在,則根據選取的變體在用戶端上設定 Cookie。實驗 cookie 用於確保單一使用者始終接收相同的頁面變體,以避免破壞其 Web 體驗。

若要變更變體選取邏輯 (例如增加變體 B 的百分比),需要更新檢視器事件的函數程式碼,這通常僅需數秒即可完成。完成 A/B 測試實驗後,您可移除邊緣函數以節省成本。

頻繁的 A/B 測試

如果您在網站上持續實踐 A/B 測試,並且每天進行實驗,您仍可使用之前以 CloudFront Function 為基礎的解決方案。然而,建議將變體選取參數 (例如變體權重) 與函數程式碼分離。您可使用 CloudFront KeyValueStore,以在函數程式碼之外存放此類參數。KeyValueStore 非常適合用於全域 (每個 PoP)、低延遲讀取、
大規模鍵值資料儲存 (每秒數百萬個請求)。

請注意,您的使用案例應遵守 KeyValueStore 配額,例如大小上限 (5 MB) 或每秒幾次 API 呼叫的變更速度限制。

CapitalOne 案例研究:使用 CloudFront Functions 和 KeyValueStore 進行 A/B 測試

進階 A/B 測試

如果以 CloudFront 函數為基礎的解決方案不符合您的 A/B 測試需求,例如,如果 KeyValueStore 配額對您的使用案例設有限制,請考慮採用以 Lambda@Edge 為基礎的解決方案。如果您營運一個大型電子商務網站,且許多團隊以高速度在網站的不同部分同時執行實驗,則可能是這種情況。  在此案例中,使用 Lambda@Edge 而非 CloudFront 函數,並利用外部資料來源 (例如 DynamoDB 全域表) 來存放 A/B 測試參數。LaunchDarkly 之類的功能管理工具提供與 DynamoDB 的整合,以保留 A/B 測試參數。

資源

本頁對您是否有幫助?