【问题标题】:Signalr webfarm with Backplane out of syncSignalr webfarm 与背板不同步
【发布时间】:2013-08-14 13:09:14
【问题描述】:

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

每个集线器都有一个数据集形式的内部缓存。 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();
    }

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

【问题讨论】:

    标签: signalr


    【解决方案1】:

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

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

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

    【讨论】:

    • 这回答了你的问题吗?
    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2013-02-10
    相关资源
    最近更新 更多