Ste*_*tes 8 asp.net asp.net-mvc-4 signalr
我希望使用SignalR为客户端提供更新,更新将来自一个消息表,当应用程序发生事情时更新.
我的问题是该应用程序将有大约500-600个并发用户,我不能让他们所有人都连接到数据库并不断轮询表格.
id喜欢做什么是有一个事情{?}轮询表然后更新集线器而不是每个连接轮询..我在考虑使用单例吗?所以也许当应用程序启动时会创建一些东西,然后真正完成所有的工作..
我的问题是 - 说我有一个单身人士,每当有更新时就会被解雇.比如500个控制器订阅这个事件会有什么表现?
另外..如果有更好的方法,那么请说..这是我的第一个也是唯一的想法!
任何帮助都会很棒!
编辑:数据由遗留应用程序提供,我无法控制数据的输入方式,因此需要进行数据库轮询.
STE.
tug*_*erk 14
我宁愿不轮询数据库,因为它会浪费.我会通过打开我的数据的单个入口点(HTTP API等)来解决这个问题,然后通过SignalR Hub将更新广播到所有连接的客户端.Brad Wilson有一个非常酷的演示文稿,演示了这种方法:
Brad Wilson - 微软的现代Web Stack,主演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
}
Run Code Online (Sandbox Code Playgroud)
Brad演示的应用程序的完整源代码也可用:https://github.com/bradwilson/ndc2012.
另一个您不喜欢的选项是让数据库在数据更改后立即触发通知.然后,你可以选择它并通过SignalR广播它.这是一个例子:
使用SignalR和SqlDependency在ASP.NET中的数据库更改通知
| 归档时间: |
|
| 查看次数: |
10758 次 |
| 最近记录: |