/// <summary>
        /// Get storage connection
        /// </summary>
        public IConnection GetStorageConnection(ConnectionAddress connectionAddress)
        {
            if (!_storageConnectionPools.TryGetValue(connectionAddress, out IConnectionPool connectionPool))
            {
                lock (_storageSyncObject)
                {
                    if (!_storageConnectionPools.TryGetValue(connectionAddress, out connectionPool))
                    {
                        var connectionPoolOption = new ConnectionPoolOption()
                        {
                            ConnectionAddress          = connectionAddress,
                            ConnectionLifeTime         = _configuration.ConnectionLifeTime,
                            ConnectionConcurrentThread = _configuration.ConnectionConcurrentThread,
                            MaxConnection = _configuration.StorageMaxConnection,
                            ScanTimeoutConnectionInterval = _configuration.ScanTimeoutConnectionInterval
                        };

                        connectionPool = _connectionPoolFactory.CreateConnectionPool(connectionPoolOption);
                        if (!_storageConnectionPools.TryAdd(connectionAddress, connectionPool))
                        {
                            _logger.LogWarning("Fail to add connection pool to storage connection pools! ConnectionAddress:{0}", connectionAddress);
                        }
                    }
                }
            }

            if (connectionPool == null)
            {
                throw new ArgumentException($"Can't find any connection pools for {connectionAddress}");
            }
            return(connectionPool.GetConnection());
        }
        /// <summary>
        /// Get tracker connection
        /// </summary>
        public IConnection GetTrackerConnection()
        {
            var rd                = new Random();
            var index             = rd.Next(_configuration.Trackers.Count);
            var tracker           = _configuration.Trackers[index];
            var connectionAddress = new ConnectionAddress(tracker.IPAddress, tracker.Port);

            if (!_trackerConnectionPools.TryGetValue(connectionAddress, out IConnectionPool connectionPool))
            {
                lock (_trackerSyncObject)
                {
                    if (!_trackerConnectionPools.TryGetValue(connectionAddress, out connectionPool))
                    {
                        var connectionPoolOption = new ConnectionPoolOption()
                        {
                            ConnectionAddress          = connectionAddress,
                            ConnectionLifeTime         = _configuration.ConnectionLifeTime,
                            ConnectionConcurrentThread = _configuration.ConnectionConcurrentThread,
                            MaxConnection = _configuration.TrackerMaxConnection,
                            ScanTimeoutConnectionInterval = _configuration.ScanTimeoutConnectionInterval
                        };

                        connectionPool = _connectionPoolFactory.CreateConnectionPool(connectionPoolOption);
                        if (!_trackerConnectionPools.TryAdd(connectionAddress, connectionPool))
                        {
                            _logger.LogWarning("Fail to add connection pool to tracker connection pools! ConnectionAddress:{0}", connectionAddress);
                        }
                        else
                        {
                            connectionPool.Start();
                        }
                    }
                }
            }

            return(connectionPool.GetConnection());
        }