【问题标题】:Improving scale out performance for multiple web instances using SignalR Redis Backplane使用 SignalR Redis 背板提高多个 Web 实例的横向扩展性能
【发布时间】:2017-04-26 06:05:32
【问题描述】:

我在我们的应用程序中集成了 SignalR,它一直运行良好。 几天前,由于某些要求,我们不得不支持应用程序的横向扩展——因此我们选择了使用 Redis 的 SignalR 横向扩展。

但是,自从集成以来,SignalR 本身已经停止工作,我们得到的错误是:NO TRANSPORT 可以成功初始化。尝试为自动初始化指定不同的传输或根本不指定。

应用的方法: - 尝试使用不同版本的 SignalR,如在线建议的那样 - 没有帮助 - 增加连接超时 - 没有帮助

需要一些帮助来解决这个问题。也欢迎提出使用任何其他方法的建议。

[Update1] 添加代码sn-ps

public class Startup
{
  public void Configuration(IAppBuilder app)
  {
    // Any connection or hub wire up and configuration should go here
    GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
    app.MapSignalR();
  }
}

更多参考,我点击了这个链接:https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-with-redis

[更新2]

public void Configuration(IAppBuilder app)
{
 GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);
 GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
 GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);
 GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromSeconds(45);

 ConfigureAuth(app);
 ConfigureSignalR(app);

 // SignalR backplane code changes
 string server = RoleEnvironment.IsAvailable ?
                        RoleEnvironment.GetConfigurationSettingValue(Constant.ConfigKeys.RedisCacheEndpoint) : 
                        ConfigurationManager.AppSettings[Constant.ConfigKeys.RedisCacheEndpoint];
 string port = RoleEnvironment.IsAvailable ?
                      RoleEnvironment.GetConfigurationSettingValue(Constant.ConfigKeys.RedisCachePort) :
                      ConfigurationManager.AppSettings[Constant.ConfigKeys.RedisCachePort];
 string password = RoleEnvironment.IsAvailable ?
                          RoleEnvironment.GetConfigurationSettingValue(Constant.ConfigKeys.RedisCachePassword) :
                          ConfigurationManager.AppSettings[Constant.ConfigKeys.RedisCachePassword];

 const string SIGNALR_REDIS_APPNAME = "Phoenix 2.0 Admin Tool";
 string connectionString = server + ":" + Int32.Parse(port) + ";password=" + password + ",ssl=True,abortConnect=False"; 
 RedisScaleoutConfiguration cfg = new RedisScaleoutConfiguration(connectionString, SIGNALR_REDIS_APPNAME);
 GlobalHost.DependencyResolver.UseRedis(cfg);
 app.MapSignalR();
}

【问题讨论】:

  • 你能显示用于连接到 SignalR 的客户端代码吗?你是如何向外扩展的?您是否在一台 IIS 服务器中安装了 ARR 以使用应用程序服务器配置网络农场?
  • @Alisson - 在问题中添加了代码 sn-p inline
  • 新发现 - 它适用于 prem redis 服务器,而不适用于 Azure Redis 缓存。假设问题可能出在身份验证中。有什么想法吗?
  • 我不知道。您是否必须更改 prem 服务器上的任何内容?
  • 不。同样的老东西。

标签: redis signalr signalr-backplane scaleout-hserver


【解决方案1】:

我们有一个 Azure AppService,并且能够使用带有 Redis 背板的 SignalR。我确实观察到根据连接字符串的内容,事情不能正常工作。我们使用了 GlobalHost.DependencyResolver.UseRedis API 的 RedisScaleoutConfiguration 重载,而不是使用您显示的重载。

这是基于我们工作启动的代码块(更改了值以保护易受攻击者):

const string SIGNALR_REDIS_APPNAME = "OurAppName";
string connectionString = "thename.redis.cache.windows.net:6380;password=somelongsecret,ssl=True,abortConnect=False";
RedisScaleoutConfiguration cfg = new RedisScaleoutConfiguration(connectionString, SIGNALR_REDIS_APPNAME);
GlobalHost.DependencyResolver.UseRedis(cfg);

显然,您可以使用更多代码从web.config 获取实际连接字符串。我们在指定非默认数据库名称时也遇到了麻烦,因此在此处使用默认值。

希望这会有所帮助。

【讨论】:

  • 我可能错过了什么。您是在本地运行还是在云端运行?如果云是在 Azure AppService 或 CloudService 中运行?如果 Azure 应用服务在应用程序设置中 on 开启了 WebSockets? Redis 是在本地运行还是在云端运行?
  • redis实例在云端,运行在云服务上。 Websockets 也已开启。
猜你喜欢
  • 2023-04-10
  • 2015-12-14
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2016-08-13
  • 2016-12-09
相关资源
最近更新 更多