有人可以解释一下Booksleeve和Redis如何协同工作以及它在SignalR应用程序中的应用程序吗?

时间:2012-12-20 22:38:05

标签: redis signalr azureservicebus booksleeve

我们正在为SignalR应用程序实施横向扩展,并尝试避免群集中出现单点故障。因此,需要多个Redis消息总线服务器。

与实施Redis的哨兵的问题是,在故障转移,一个客户端需要连接到一个新的端点[地址],这将需要应用SignalR被重新启动(在定义的Application_Start Redis的端点())。

不是一种选择。

我正在努力了解Booksleeve是否/如何提供帮助,并希望有人解释一下。

问题是我们只能为消息总线定义一个单一端点。硬件解决方案目前不是一种选择。

SignalR应用程序是否会连接到Booksleeve包装器,它会维护主/从列表?

使用Azure Service Bus的另一个选项。但是,连接Windows Azure服务总线提供程序instructions表示仍存在此问题:

  

请注意,此网站是一个以Azure Web角色运行的ASP.NET网站。   从1.0alpha2开始,AzureWebSites中存在一些错误   ServiceBus横向扩展方案不能很好地工作。我们正在努力   为将来解决这个问题

2 个答案:

答案 0 :(得分:3)

我不知道SignalR如何进行连接的具体细节,但是:BookSleeve已经为故障转移节点提供了一些让步。特别是,ConnectionUtils.Connect方法采用字符串(对于web.config配置值等是理想的),其中可以包含多个 redis节点,然后BookSleeve将尝试找到最合适的节点连接至。如果字符串中提到的节点是常规redis节点,它将尝试连接到主节点,否则将返回到从节点(可选择在进程中提升从节点)。如果提到的节点是sentinel节点,它将要求sentinel指定一个serer连接。

BookSleeve 目前提供的是一个冗余的连接包装器,它将自动重新连接。这是在路线图上,但在调用代码中并不难做到。我计划在实施redis-cluster支持的同时为此添加更多支持。

但是:所有这些都来自BookSleeve的观点 - 我不能专门评论SignalR。

答案 1 :(得分:1)

BookSleeve 1.3.41.0支持Redis哨兵。我们使用的部署配置:1个主机redis,1个从机redis。每个盒子都有哨兵(一个用于主人,一个用于奴隶)。客户端首先连接到sentinel,然后将sentinel重定向到活动主服务器。

这是在客户端代码中实现的方式:

public class OwinStartup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new WebClientRedisScaleoutConfiguration();
        GlobalHost.DependencyResolver.UseRedis(config);
        app.MapSignalR();
    }
}

public class WebClientRedisScaleoutConfiguration : RedisScaleoutConfiguration
{
    public WebClientRedisScaleoutConfiguration()
        : base(() => getRedisConnection(), WebUIConfiguration.Default.Redis.EventKey)
    { }

    private static BookSleeve.RedisConnection _recentConnection;
    private static BookSleeve.RedisConnection getRedisConnection()
    {
        var log = new TraceTextWriter();
        var connection = BookSleeve.ConnectionUtils.Connect("sentinel1:23679,sentinel2:23679,serviceName=WebClient", log);
        if (connection != null)
        {
            _recentConnection = connection;
            return connection;
        }

        if (_recentConnection != null)
        {
            return _recentConnection;
        }

        // Cannot return null nor throw exception -- this will break reconnection cycle.
        return new BookSleeve.RedisConnection(string.Empty);
    }
}

热配置redis。 常用步骤 下载Redis for windows http://redis.io/download 解压缩到c:\ redis

主人(只有第一个redis框,只有一个这样的配置)

  1. 创建Redis服务:在redis目录redis-server --service-install redis.conf --service-name redis
  2. 中执行命令
  3. 启动Redis服务
  4. 确保Redis列出端口6379
  5. 奴隶(其他方框)

    1. 更新redis.conf:添加行slaveof masterAddr 6379 masterAddr 是主模式下redis运行的地址,默认为6379 雷迪斯港。
    2. 创建Redis服务:在redis目录redis-server --service-install redis.conf --service-name redis
    3. 中执行命令
    4. 启动Redis服务
    5. 确保Redis列出端口6379
    6. Sentinel(主要和奴隶共同)

      1. 使用内容创建文件redis-sentinel.conf: port 26379 logfile "redis-sentinel1.log" sentinel monitor WebClient masterAddr 6379 1

        其中masterAddr是运行主模式的redis的地址, 6379是默认的redis端口,1是quorum(主机的数量 决定服务器是否关闭)。 WebClient是组名。您可以在客户端代码ConnectionUtils.Connect("...,serviceName=WebClient...")

      2. 中指定它
      3. 创建redis sentinel服务:在redis目录redis-server --service-install redis-sentinel.conf --service-name redis-sentinel --sentinel
      4. 中执行命令
      5. 启动redis-sentinel服务