問題:web應用伺服器如何主動推送消息給用戶端/浏覽器?
我們在開發類似股票、期貨這類基于行情的政策交易系統時,都是需要實時接收最新的交易所資料,根據最新的行情資料處理,如果一旦出現我們關注的資訊,肯定希望盡量快的推送給使用者。
傳統解決方法
方法1 polling
通過用戶端不斷發請求給伺服器,伺服器接收到請求後,進行處理響應并回複結果。這種輪詢,比如js定時器發送http請求,然後獲得應答。
優點
request/response請求響應方式,簡單。
缺點
用戶端一多,伺服器會有很多的無效處理,浪費伺服器資源,而且實時性也并不好,依賴于用戶端輪詢的頻率。
方法2 long polling
用戶端也是定期發送給伺服器,但是伺服器并不是立即響應,而是等到有需要的處理結果才會發送給用戶端,如果沒有,則伺服器會對該會話等待一段時間,隻要該時間内,出現需要的資料結果就會立即通知用戶端。
優點
相比方法1,可以看到這種方式無需不停的發起請求占用伺服器資源,并且在一次請求,伺服器等待處理未逾時之前,一旦有滿足資料結果,可以做到實時發送給用戶端。比方法1節省了很多資源。
缺點
但是依然需要輪詢,隻是輪詢的頻率下降了些。
現在的解決方法
WebSocket
WebSocket,采用與底層Socket編寫程式的方式,使得可以開發出雙向的實時通信應用。但是開發複雜度較高,如同Socket一樣,隻提供了資料通信功能,并沒有針對應用層提供RPC調用機制。資料通信還需要涉及到将資料解析成對象,将對象序列成資料,同時還要對不同資料進行不同方法邏輯的調用,
Asp net core中SignalR
SignalR可以看作是一種RPC架構,但是其支援實時調用,即其底層可以使用WebSocket作為通信方式,而且,其也支援polling和long polling,因為signalR也提供了自動檢測目前浏覽器支援哪一種方式。有了這個SignalR的提供的功能,可以很友善的實作用戶端和浏覽器端的實時調用關系。比如開發一個實時的聊天系統。