SignalR 輪詢數據庫以獲取更新
我希望使用 SignalR 向客戶端提供更新,更新將來自消息表,當應用程序發生事情時更新該消息表。
我的問題是應用程序將有大約 500-600 個並髮使用者,我不能讓所有使用者都連接到數據庫並不斷輪詢表。
id 喜歡做的是有一個單一的事情{?} 輪詢表,然後更新集線器而不是每個連接輪詢.. 我正在考慮為此使用單例?所以也許當應用程序啟動時,會創建一些東西,然後真正完成所有工作..
我的問題是 - 假設我有一個單例,它有一個事件,每次有更新時都會觸發。如果說 500 個控制器訂閱此事件,性能會如何?
另外..如果有更好的方法可以做到這一點,那麼請說..這是我的第一個也是唯一一個可悲的想法!
任何幫助都會很棒!
編輯:數據是由遺留應用程序提供的,我無法控制數據的輸入方式,因此需要進行數據庫輪詢。
你是。
抱歉,這個解決方案不是 signalR,但也許你可以從中獲得靈感。
我寧願不輪詢數據庫,因為這會很浪費。我會通過只為我的數據(HTTP API 等)打開一個入口點來解決這個問題,然後通過 SignalR Hub 向所有連接的客戶端廣播更新。Brad Wilson 有一個非常酷的展示文稿,展示了這種方法:
Brad Wilson - Microsoft 的現代 Web 堆棧,由 ASP.NET Web API 主演
這是此方法的程式碼範例,它使用 ASP.NET Web API 技術進行數據輸入。它使用記憶體字典進行數據儲存,但這裡不關心數據儲存技術:
// This hub has no inbound APIs, since all inbound communication is done // via the HTTP API. It's here for clients which want to get continuous // notification of changes to the ToDo database. [HubName("todo")] public class ToDoHub : Hub { } public abstract class ApiControllerWithHub<THub> : ApiController where THub : IHub { Lazy<IHubContext> hub = new Lazy<IHubContext>( () => GlobalHost.ConnectionManager.GetHubContext<THub>() ); protected IHubContext Hub { get { return hub.Value; } } } public class ToDoController : ApiControllerWithHub<ToDoHub> { private static List<ToDoItem> db = new List<ToDoItem> { new ToDoItem { ID = 0, Title = "Do a silly demo on-stage at NDC" }, new ToDoItem { ID = 1, Title = "Wash the car" }, new ToDoItem { ID = 2, Title = "Get a haircut", Finished = true } }; private static int lastId = db.Max(tdi => tdi.ID); // Lines removed for brevity public HttpResponseMessage PostNewToDoItem(ToDoItem item) { lock (db) { // Add item to the "database" item.ID = Interlocked.Increment(ref lastId); db.Add(item); // Notify the connected clients Hub.Clients.addItem(item); // Return the new item, inside a 201 response var response = Request.CreateResponse(HttpStatusCode.Created, item); string link = Url.Link("apiRoute", new { controller = "todo", id = item.ID }); response.Headers.Location = new Uri(link); return response; } } // Lines removed for brevity }Brad 展示的應用程序的完整原始碼也可在:https ://github.com/bradwilson/ndc2012 獲得。
您不喜歡的另一個選項是讓您的數據庫在數據更改後立即觸發通知。然後,您可以將其拾取並通過 SignalR 進行廣播。這是一個例子: