我们有一个 SignalR 应用程序,我们构建并测试了它可以在单个 Web 服务器上使用。需求发生了变化,我们需要将应用程序部署到 webfarm。SignalR 支持多个背板,因为应用程序已经使用了我们已经实现的 Sql Server。随着第二个 Web 节点的引入,我们遇到了保持集线器内缓存的数据在节点之间同步的问题。
每个集线器都有一个数据集形式的内部缓存。
private static DataSet _cache;
当客户端第一次请求数据时,缓存会被填充,并且从那里任何交互都会更新本地缓存和 sql 服务器,然后通知所有连接的客户端更改。
背板处理客户端之间的广播消息,但另一个节点没有收到消息。
我们的第一个想法是,可能有一种我们可以连接的方法,它会从背板触发,向节点客户端发送消息,但我们还没有在文档中看到这样的事情。
我们的第二个想法是在集线器内创建一个 .net 客户端。
private async void ConnectHubProxy()
{
IHubProxy EventViewerHubProxy = _hubConnection.CreateHubProxy("EventViewerHub");
EventViewerHubProxy.On<string>("BroadcastAcknowledgedEvents", EventIDs => UpdateCacheIsAcknowledged(EventIDs));
EventViewerHubProxy.On<string>("BroadcastDeletedEvents", EventIDs => UpdateCacheIsDeleted(EventIDs));
ServicePointManager.DefaultConnectionLimit = 10;
await _hubConnection.Start();
}
我们的问题:我们如何保持缓存同步?第一个想法是否可能,我们在文档中错过了它?将集线器连接到自身是否有任何问题?