ASP.NET Core SignalR 概述,自行去官網搜。
SignalR 沒有控制和前端推送頻率的功能,就是后端一旦發送請求,前端立馬響應。或者前端發送請求,后端立馬響應,但是如果誤操作,或者業務原因,對產生的信息頻繁的推送,此時就會對系統的性能產生一定影響。
鑒于以上情況,我對SignalR 發送請求的時候,做了簡單的改造。我們可以通過配置文件,或者前后端傳入的參數,對SignalR 推送的頻率做了限制。
這里我設置的參數是:?每多少秒/每多少次,當時你也可以 每小時/每天...
NET CORE默認自帶 Microsoft.Extensions.Caching.Memory 緩存功能,于是我基于緩存的策略,來控制SignalR控制推送頻率。
構造函數如下:
private readonly IMemoryCache _memoryCache;
如果你們目前使用Redis把?IMemoryCache 替換成你們的Redis也可以,因為MemoryCache 使用 key-value操作時也是 ?Set、Get
相關代碼如下
public?int?SignalRxxxxxx(int?count?=?10,?int?seconds?=?60){var signalRFrequencyCount = _memoryCache.Get<int>("Count");var signalRFrequencyMinutes = _memoryCache.Get<int>("Minutes");if (signalRFrequencyMinutes == 0){_memoryCache.Set("Count", 1);_memoryCache.Set("Minutes",?seconds,?TimeSpan.FromSeconds(seconds));//_signalRClients.AddMessageToAll(你的業務);}if (signalRFrequencyCount < count && signalRFrequencyMinutes != 0){_memoryCache.Set("Count",?signalRFrequencyCount?+?1);//?_signalRClients.AddMessageToAll(你的業務);}return signalRFrequencyCount;}
這個邏輯,其實就是API網關的限流的原理一樣,同一個接口,頻繁的請求指定次數,就會返回一個狀態的提示。這個方法用在全局上,就會對系統的整體請求做處理,當然我這只是僅僅對SignalR的推送做一個頻率的控制。