为什么ServiceStack.Redis会抛出错误而不是尝试连接到另一个读取实例?

时间:2012-09-03 03:24:37

标签: caching redis servicestack

我在两台机器上成功安装了Redis,然后成为Master-Slave。 我测试了一些代码来检查复制是否正常,一切正常。

我的客户经理看起来像

var manager = new PooledRedisClientManager(new[] { "MasterIP:6379" }, new[] { "MasterIP:6379", "SlaveIP:6379" });

但现在我关闭了我的主实例,当我再次测试我的代码时,我得到一个错误,例如客户端无法连接到主服务器。

p.s对于读取,我使用GetReadOnlyCacheClient();

我重复了我的代码,我注意到客户端首先获得了Master(错误无法连接),然后当我再次运行我的代码时,客户端正在获取Slave,然后当我运行我的代码时,客户端再次获得主服务器等等。 / p>

我在ServiceStack.Redis客户端上下载了源代码。我只想检查何时发生错误,这是代码。

private void Connect()
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        {
            SendTimeout = SendTimeout,
            ReceiveTimeout = ReceiveTimeout
        };
        try
        {
            if (ConnectTimeout == 0)
            {
                socket.Connect(Host, Port);
            }
            else
            {
                var connectResult = socket.BeginConnect(Host, Port, null, null);
                connectResult.AsyncWaitHandle.WaitOne(ConnectTimeout, true);
            }

            if (!socket.Connected)
            {
                socket.Close();
                socket = null;
                return;
            }
            Bstream = new BufferedStream(new NetworkStream(socket), 16 * 1024);

            if (Password != null)
                SendExpectSuccess(Commands.Auth, Password.ToUtf8Bytes());

            db = 0;
            var ipEndpoint = socket.LocalEndPoint as IPEndPoint;
            clientPort = ipEndpoint != null ? ipEndpoint.Port : -1;
            lastCommand = null;
            lastSocketException = null;
            LastConnectedAtTimestamp = Stopwatch.GetTimestamp();

            if (ConnectionFilter != null)
            {
                ConnectionFilter(this);
            }
        }
        catch (SocketException ex)
        {
            if (socket != null)
                socket.Close();
            socket = null;

            HadExceptions = true;
            var throwEx = new RedisException("could not connect to redis Instance at " + Host + ":" + Port, ex);
            log.Error(throwEx.Message, ex);
            throw throwEx;
        }
    }

我真的不明白这个代码,couze项目真的很大,但我认为没有如果此服务器出现故障,那么尝试从只读服务器列表中的其他主机获取(如果存在其他任何内容)

我可以制作一些我的自定义逻辑来检查是否未能尝试获取另一个只读实例..但是这个客户端是否支持为此问题做好准备?

0 个答案:

没有答案