我将使用 SignalR 和 Redis 设置具有故障转移环境的横向扩展。第一步是确保 Redis 正在处理 SignalR 节点之间的通信(当前问题)。随后将连接 Redis Sentinel 和 BookSleeve,以便 SignalR 节点访问单个 Redis 端点。
在他的文章Scaling SignalR with Redis中,@mirajavora 解释了如何设置单实例 Redis 环境。
为了测试(即使这最终将驻留在 *nix 机器上),我在 Windows 上设置了 Redis。服务器启动,我将 SignalR 应用程序配置为使用 Redis 消息总线。
我通过在没有运行 Redis 的情况下运行应用程序来验证 SignalR 应用程序正在使用 Redis。我收到一个预期的错误,指示:
无法建立连接,因为目标机器主动拒绝它 127.0.0.1:6379
然后我启动 Redis 并回收 SignalR 应用程序池。
使用以下 URL,我验证 SignalR 应用程序正在与 Redis 通信:
newsfeedlocal1:8082/signalr?transport=longPolling&connectionId=7285d6e5-412c-4bca-9897-5f9ab1ebcece&connectionData=%5B%7B%22name%22%3A%22newsfeedhub%22%7D%5D&messageId=B%2C0%7CF%2C2%7CG%2C0 %7CH%2C0&tid=5&callback=jQuery17204961678246036172_1357588747275&_=1357588762433
Redis状态:
到目前为止一切顺利......应用程序按预期运行。
在他的文章结尾处,Mira 在 Global.asax 中有以下行,我在其他文档中没有看到:
RouteTable.Routes.MapConnection("echo", "echo/{*operation}");
我的 SignalR 项目中没有 DistributedConnection 对象,并且已将其省略(因为我在GitHub 文档中没有看到它。对此行有任何进一步的解释吗?
Mira 的文章建议增加最大工作进程数以进行本地测试。将此设置为 1 以外的任何数字,都会中断节点之间的通信。客户端 1 执行一些操作来通知连接的客户端 2 - 其中窗口 1 在窗口 2 上向客户端 2 发送通知。
我确实看到了多个工作进程,但不知何故我认为这不是一个好的测试场景。我打开了 Fiddler,但不确定要寻找什么来进一步调试此问题。像这样的测试是否真的能正确模拟多个 SignalR 节点?
目前我正在测试这个没有负载平衡器。有推荐的软件负载均衡器吗?