2

我们有一个 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();
    }

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

4

1 回答 1

1

在横向扩展场景中拥有“状态”的推荐方法是拥有持久性源。因此,在您的情况下,如果您希望拥有一个“类似全局的”缓存,那么您可以通过数据库来实现它。

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

拥有内存缓存不是一个好主意的原因是,在网络场中,如果节点出现故障,它们就会丢失所有的内存缓存。通过具有持久性,无论节点是运行了几天还是刚刚从基于“关闭”的故障中恢复,持久层始终存在。

于 2013-08-13T15:44:11.440 回答