Asp.net SignalR轮询数据库以获取更新

Asp.net SignalR轮询数据库以获取更新,asp.net,asp.net-mvc-4,signalr,Asp.net,Asp.net Mvc 4,Signalr,我希望使用signar向客户端提供更新,更新将来自一个消息表,该消息表在应用程序中发生事件时更新 我的问题是,应用程序将有大约500-600个并发用户,我不能让所有用户都连接到数据库并不断地对表进行轮询 id想要做的是做一件事{?}轮询表,然后更新集线器,而不是每次轮询连接。。我想用一个单件来做这个?因此,当应用程序启动时,可能会创建一些东西来完成所有工作 我的问题是——假设我有一个单身汉,每次有更新时都会触发一个事件。。订阅此活动的500名控制器的性能如何 还有。。如果有更好的方法,请说。。这

我希望使用signar向客户端提供更新,更新将来自一个消息表,该消息表在应用程序中发生事件时更新

我的问题是,应用程序将有大约500-600个并发用户,我不能让所有用户都连接到数据库并不断地对表进行轮询

id想要做的是做一件事{?}轮询表,然后更新集线器,而不是每次轮询连接。。我想用一个单件来做这个?因此,当应用程序启动时,可能会创建一些东西来完成所有工作

我的问题是——假设我有一个单身汉,每次有更新时都会触发一个事件。。订阅此活动的500名控制器的性能如何

还有。。如果有更好的方法,请说。。这是我的第一个也是唯一的想法

任何帮助都会很棒

编辑:数据由遗留应用程序提供,我无法控制数据的输入方式,因此需要进行数据库轮询


ste.

我不想轮询数据库,因为这样会浪费时间。我将通过只打开一个数据入口点(HTTP API等)来解决这个问题,然后通过SignalR Hub向所有连接的客户端广播更新。Brad Wilson有一个超级酷的演示,演示了这种方法:

下面是此方法的代码示例,该方法使用ASP.NETWebAPI技术进行数据输入。它使用内存字典进行数据存储,但此处不考虑数据存储技术:

// 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
}
//此中心没有入站API,因为所有入站通信都已完成
//通过HTTP API。它是为那些希望获得连续服务的客户提供的
//ToDo数据库更改通知。
[丈夫姓名(“todo”)]
公共类ToDoHub:Hub{}
公共抽象类ApiControllerWithHub:ApiController
我在哪里{
Lazy-hub=新的Lazy-hub(
()=>GlobalHost.ConnectionManager.GetHubContext()
);
受保护的IHubContext中心{
获取{return hub.Value;}
}
}
公共类ToDoController:ApiControllerWithHub{
私有静态列表db=新列表{
新ToDoItem{ID=0,Title=“在NDC的舞台上做一个愚蠢的演示”},
新ToDoItem{ID=1,Title=“洗车”},
新ToDoItem{ID=2,Title=“理发”,Finished=true}
};
私有静态int lastId=db.Max(tdi=>tdi.ID);
//为简洁起见,删除了行
公共HttpResponseMessage PostNewToDoItem(ToDoItem项目){
锁(db){
//将项目添加到“数据库”
item.ID=联锁增量(参考lastId);
db.添加(项目);
//通知已连接的客户端
枢纽.客户.附件(项目);
//在201响应中返回新项
var response=Request.CreateResponse(HttpStatusCode.Created,item);
字符串link=Url.link(“apiRoute”,new{controller=“todo”,id=item.id});
response.Headers.Location=新Uri(链接);
返回响应;
}
}
//为简洁起见,删除了行
}
Brad演示的应用程序的完整源代码也可用:

另一个您不喜欢的选项是,使数据库在数据更改时立即发出通知。然后,你们可以拿起它并通过信号器进行广播。以下是一个例子:


很抱歉,此解决方案不是Signal,但也许您可以从中获得一些想法


以下是

您的数据库技术是什么?SQL Server、MongoDB、RavenDB等?我想问的是,因为有些数据库技术有一种在数据更改时立即触发通知事件的方法。@tugberk我们使用Oracle,但我不想将此解决方案与数据库技术捆绑在一起。虽然这是一个很好的解决方案,但这对我来说是不可能的。我们正在一个遗留应用程序上添加前端,表中的数据主要来自数据库触发器和其他数据库逻辑。如果使用Azure会怎么样。哪些不会在行更改时触发事件?回到投票?这看起来很好,事实上,你有没有可能提供一个这样的例子,用我提到的东西工作?嘿,当然。。。我可以创建一个示例,其中WebClient和(假)其他客户端都更新数据库,控制器将信息推送到客户端。。。这当然可以用很多高级的方法来完成,但我会保持它的愚蠢和简单(从一开始)编辑:当我是doneThanks mate时,会在这里发布一个链接,那将是狂热的!嘿,斯蒂奥茨。我已经创建了一个项目。。。只需添加一些注释,然后为您将其放在github上。今晚可能在那里。找不到页面!你有备份链接吗?