在 Web 應用程式中使用 SignalR Service 來啟用自動更新
接下來,我們會離開輪詢,並前往要將資料更新 (如有發生) 推送至連線用戶端的應用程式。 這個新設計可降低流量,並藉由只在資料變更時進行更新來建構更有效率的 UI。 我們會使用下列三種技術來傳遞這個更新的解決方案:Azure Cosmos DB、Azure Functions 和 SignalR。
Azure Cosmos DB:當資料庫中的資料變更時,Azure Cosmos DB 會公開「變更摘要」。 Azure Cosmos DB 中變更摘要支援的運作方式是接聽資料庫容器的變更。 接著將依文件的修改順序來輸出已變更文件的排序清單。 當您的應用程式接聽變更摘要時,它會自動回應資料變更。
Azure Functions:此函數與原始
getStocks
函數之間的主要差異是現在會根據我們的資料變更觸發此函數。 在上述練習中,我們根據來自用戶端的要求觸發了函數,並透過 Azure Cosmos DB 輸入繫結提取回所有資料。 使用 Azure Cosmos DB 觸發程序會自動讓我們的資料擷取更具效率。 Azure Functions 的特色是任何時候都能在 Azure Cosmos DB 變更摘要中更新資料時執行程式碼的繫結。 一旦函數會接聽變更摘要之後,您接著就能使用只代表資料變更的資料子集。Azure SignalR:此服務會在從 Azure Functions 應用程式接聽 SignalR 廣播的用戶端上,提供與 SignalR 連線的雙向通訊。
SignalR 與持續連線
相較於輪詢,更有利的設計特色是用戶端和伺服器之間的持續連線。 建立持續連線,讓伺服器能夠隨意地將資料推送至用戶端。 依需求的連線本質可降低伺服器上的網路流量和負載。 SignalR 可讓您輕鬆地將此類型的架構新增至您的應用程式。
SignalR 是一系列技術的抽象概念,可讓您的應用程式在用戶端與伺服器之間享有雙向通訊。 SignalR 會自動處理連線管理,讓您能夠將訊息同時廣播到所有連線的用戶端,例如聊天室。 您也可以將訊息傳送給特定的用戶端。 不同於傳統的 HTTP 連線,用戶端與伺服器之間的連線是持續性的,此連線會基於每次通訊重新建立。
SignalR 所提供之抽象概念的主要優點是它支援「傳輸」後援的方式。 傳輸是在用戶端和伺服器之間進行通訊的方式。 SignalR 連線會從標準 HTTP 要求開始。 由於伺服器會評估連線,因此會選取最適當的通訊方法 (傳輸)。 與用戶端的持續連線配對時,函數就能依需求來連絡個別用戶端,此為即時應用程式架構的基礎。 傳輸的選擇取決於可在用戶端上使用的 API:
- HTML 5:對於支援 HTML 5 的用戶端,預設會使用 WebSockets API 傳輸。
- WebSockets:如果用戶端不支援 WebSockets,則 SignalR 會回復為伺服器傳送事件 (也稱為 EventSource)。
- 其他技術:對於較舊的用戶端,可以使用 Ajax 長時間輪詢或永久框架 (僅限 IE) 來模擬雙向連線。
SignalR 所提供的抽象層可為您的應用程式提供兩個優點。 第一個優點是您的應用程式與未來技術的兼容性。 隨著 Web 的發展且 API 會優先 WebSockets 成為可供使用狀態,您的應用程式不需要變更。 您可以更新為支援任何新 API 的 SignalR 版本,而無需徹底修改應用程式的程式碼。
第二個優點是 SignalR 可讓您的應用程式根據用戶端的支援技術順利地降級。 如果它不支援 WebSockets,則會使用伺服器傳送事件。 如果用戶端無法處理伺服器傳送事件,則會使用 Ajax 長時間輪詢,依此類推。
讓我們看看如何使用 SignalR,以廣播來自讀取 Azure Cosmos DB 變更摘要之函式的資訊。