我在负载均衡器后面的多个服务器中使用SignalR。我将connnection id和用户id存储在sql server的自定义数据库表中。每次,我都需要向选定的用户发送通知。它在单服务器环境中运行良好。如何在不使用现有背板选项的情况下使用自定义数据库表扩展SignalR实现?
答案 0 :(得分:0)
我不确定你目前的实施情况是什么,因为你的解释似乎有些混乱。如果在负载均衡器后面有多个服务器,则意味着您应用了一些技术(我想是这样!)。但是你说它在单服务器环境中运行良好,但在多个服务器中运行不正常。让我们回顾一下多个服务器的强制要求(横向扩展)
实例之间的通信:这意味着一个实例中的任何消息都可用于所有其他实例。经典实现是任何类型的队列,SignalR支持Redis,您可以使用SQL Server,但它清楚任何SQL解决方案的限制。 Azure将Redis缓存作为PaaS
内存存储:您通常在单个服务器中使用它,但必须实现共享内存。同样,Redis有一个共享内存解决方案,以防您有服务器可用。没有像Redis这样的解决方案,没有任何可能实现这一点。 同样,性能较低的解决方案将是SQL中的MemStorage实现。
身份验证:安全性的开箱即用实现使用cookie来存储加密密钥。但是,一旦有多个服务器,每个服务器都有其唯一的密钥。要解决此问题,您必须实现自己的DataProtector,以防这是您使用的方法。
这些示例超出了这个解释范围,大多数代码(甚至没有实现实际方法的模板)都需要几页。我建议你看看强制扩展你的应用程序的3个项目。