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