Asp.net

SignalR 輪詢數據庫以獲取更新

  • January 5, 2015

我希望使用 SignalR 向客戶端提供更新,更新將來自消息表,當應用程序發生事情時更新該消息表。

我的問題是應用程序將有大約 500-600 個並髮使用者,我不能讓所有使用者都連接到數據庫並不斷輪詢表。

id 喜歡做的是有一個單一的事情{?} 輪詢表,然後更新集線器而不是每個連接輪詢.. 我正在考慮為此使用單例?所以也許當應用程序啟動時,會創建一些東西,然後真正完成所有工作..

我的問題是 - 假設我有一個單例,它有一個事件,每次有更新時都會觸發。如果說 500 個控制器訂閱此事件,性能會如何?

另外..如果有更好的方法可以做到這一點,那麼請說..這是我的第一個也是唯一一個可悲的想法!

任何幫助都會很棒!

編輯:數據是由遺留應用程序提供的,我無法控制數據的輸入方式,因此需要進行數據庫輪詢。

你是。

抱歉,這個解決方案不是 signalR,但也許你可以從中獲得靈感。

這是在 GitHub 上下載的完整範例

我寧願不輪詢數據庫,因為這會很浪費。我會通過只為我的數據(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 進行廣播。這是一個例子:

使用 SignalR 和 SqlDependency 的 ASP.NET 中的數據庫更改通知

引用自:https://stackoverflow.com/questions/14319758