共用方式為


Web -Queue-Worker 架構風格

此架構的核心元件是處理客戶端請求的 網頁前端 ,以及執行資源密集型任務、長時間執行工作流程或批次工作的工作 。 網頁前端透過 訊息隊列與工作者溝通。

一個邏輯圖,展示 Web-Queue-Worker 架構。

以下元件通常會被納入此架構中:

  • 一個或多個資料庫

  • 一個快取,用來儲存資料庫中的數值以便快速讀取

  • 一個內容傳遞網路,用來提供靜態內容

  • 非 Microsoft 服務提供者通常提供的遠端服務,如電子郵件或短訊服務(SMS)

  • 身份驗證提供者

網頁與工作者皆為無狀態,會話狀態可儲存在分散式快取中。 工作者以非同步方式處理長期工作。 佇列中的訊息可以啟動工作進程,或者可以透過排程來執行進行批次處理。 若應用程式沒有長期執行的操作,則該工作者為可選。

前端可能會包含網頁 API。 單頁應用程式可以透過呼叫 AJAX 來使用網頁 API,或是原生客戶端應用程式可以直接使用它。

使用此架構的時機

Web-Queue-Worker 架構通常透過管理運算服務如 Azure App Service 或 Azure Kubernetes Service 來實作。

請考慮以下使用情境的架構:

  • 具有相對簡單領域的應用

  • 具有長時間執行工作流程或批次操作的應用程式

  • 你偏好管理服務而非基礎設施即服務(IaaS)的情境

優點

  • 一個簡單易懂的架構

  • 最小化工作量的部署與管理

  • 明確的職責分離

  • 透過非同步訊息將前端與工作端分離

  • 前端與工人的獨立縮放

挑戰

  • 若設計不慎,前端與工人可能成為龐大且難以維護與更新的單一元件。

  • 如果前端和工作型共用資料結構或程式碼模組,可能會有隱藏的相依關係。

  • 網頁前端在持續存在資料庫後,但在將訊息送入佇列前可能會失敗,這會造成一致性問題,因為工作者沒有執行其邏輯部分。 為了緩解這個問題,你可以使用例如交易型外寄匣模式(Transactional Outbox pattern)的方法,要求先將外發訊息繞回至獨立佇列。 NServiceBus 交易會話函式庫支援此技術。

最佳做法

Web(網頁)- App Service 上的 Queue-Worker(佇列工作者)

本節描述一種推薦的 WebQueue-Worker 架構,採用 App Service。

展示 WebQueue-Worker 架構的示意圖。

下載此架構的 Visio 檔案

Workflow

  • 前端是以 App Service 網頁應用程式實作,工作端則是以 Azure Functions 應用程式實作。 網頁應用程式與函式應用程式皆與提供虛擬機(VM)實例的 App Service 計畫相關聯。

  • 你可以使用 Azure Service BusAzure Storage 佇列 來做訊息佇列。 前一圖使用儲存佇列。

  • Azure Managed Redis 儲存會話狀態及其他需要低延遲存取的資料。

  • Azure 內容傳遞網路 用於快取靜態內容,如圖片、CSS 或 HTML。

  • 儲存方面,選擇最適合你應用需求的技術。 這種方法稱為 多語持續性,在同一系統中使用多種儲存技術以滿足不同需求。 為了說明這個概念,圖中同時展示了 Azure SQL 資料庫Azure Cosmos DB

欲了解更多資訊,請參閱 基線高可用的區域冗餘網頁應用程式,以及 使用 NServiceBus 與服務匯流排建構訊息導向的商業應用程式

其他考慮

  • 並非每筆交易必須經過排隊和工作程序才能儲存。 網頁前端可以直接執行簡單的讀寫操作。 Workers 是為資源密集型任務或長時間工作流程而設計的。 有時候,你甚至根本不需要工人。

  • 利用你計算平台內建的自動縮放功能,來縮小實例數量。 如果應用程式負載遵循可預測的模式,則使用基於排程的自動縮放。 如果負載無法預測,就使用基於指標的自動縮放。

  • 考慮將網頁應用程式和功能應用程式分成不同的應用程式服務方案,讓它們能夠獨立擴展。

  • 在生產和測試時使用不同的 App Service 計畫。

  • 使用部署插槽來管理部署。 這種方法可以讓你先部署更新版本到暫存槽,然後切換到新版本。 如果更新過程中出現問題,也能切換回先前版本。