信号器webfarm与背板不同步

时间:2013-08-13 03:37:49

标签: signalr

我们有一个SignalR应用程序,我们构建并测试在单个Web服务器上使用。需求已更改,我们需要将应用程序部署到Webfarm。 SignalR支持多个背板,因为应用程序已经使用了我们已经实现的Sql Server。随着第二个Web节点的引入,我们遇到了一个问题,即保持节点内缓存的数据在节点之间同步。

每个集线器都有一个DataSet形式的内部缓存。 private static DataSet _cache;当客户端首次请求数据时,将填充缓存,并从那里开始任何交互更新本地缓存和SQL Server,然后通知所有连接的客户端这些更改。

背板处理客户端之间的广播消息,但另一个节点不接收消息。

我们的第一个想法是,可能有一种方法我们可以通过背板向节点客户端发送消息来触发,但我们还没有看到文档中提到的这样的事情。

我们的第二个想法是在集线器中创建一个.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();
    }

我们的问题: 我们如何保持缓存同步? 第一个想法是否可能,我们在文档中错过了它? 集线器连接到自身是否存在任何问题?

1 个答案:

答案 0 :(得分:1)

在扩展方案中获得“状态”的推荐方法是拥有持久性源。因此,在您的情况下,如果您希望通过数据库实现“全局式”缓存,则可以通过数据库实现。

通过创建数据库,所有节点都可以从同一个源写入/读取,因此具有全局缓存。

拥有内存缓存并不是一个好主意的原因是因为在Web场中,如果节点发生故障,它们将失去所有内存缓存。通过持久性,如果一个节点已经运行了几天或者刚刚从基于“关闭”的故障恢复,那么持久层始终存在就无所谓了。