SignalR:分布式部署

在多台服务器组成的分布式环境中,我们可以采用黏性会话或者禁用协商的方式来保证来自同一个客户端的请求被同一台服务器处理,但是在分布式环境中,还有其他问题需要解决。

假设聊天室程序被部署在两台服务器上,客户端1、2连接到了服务器A上的ChatRoomHub,而客户端3、4连接到了服务器B上的ChatRoomHub,那么在客户端1发送群聊消息的时候,只有客户端1、2能够收到,而客户端3、4收不到;在客户端3发送群聊消息的时候,只有客户端3、4能够收到,而客户端1、2收不到。因为这两台服务器之间的ChatRoomHub没有通信。为了解决这个问题,我们可以让多台服务器上的集线器连接到一个消息队列中,通过这个消息队列完成跨服务器的消息投递。

微软官方提供了用Redis服务器来解决SignalR部署在分布式环境中数据同步的方案—Redis backplane,其使用方法如下。
第1步:
我们通过NuGet安装Microsoft.AspNetCore.SignalR.StackExchangeRedis
第2步:
我们在Program.cs中的AddSignalR后添加AddStackExchangeRedis来指定要连接的Redis配置。

builder.Services.AddSignalR().AddStackExchangeRedis("127.0.0.1", options =>
{
    options.Configuration.ChannelPrefix = "Test1_";
});

AddStackExchangeRedis方法的第一个参数为Redis服务器的连接字符串;如果有多个SignalR应用程序连接同一台Redis服务器,那么我们需要为每一个应用程序配置唯一的ChannelPrefix
通过如上两步,我们就完成了Redis backplane的配置,就可以放心地在分布式环境中使用SignalR了。

本文学习参考自:ASP.NET Core技术内幕与项目实战

posted @ 2022-09-28 15:53  一纸年华  阅读(750)  评论(0编辑  收藏  举报