/// <summary>
        /// Given a collection of server connections, query for the topic metadata.
        /// </summary>
        /// <param name="connections">The server connections to query.  Will cycle through the collection, starting at zero until a response is received.</param>
        /// <param name="topics">The collection of topics to get metadata for.</param>
        /// <returns>MetadataResponse validated to be complete.</returns>
        public MetadataResponse Get(IKafkaConnection[] connections, IEnumerable <string> topics)
        {
            var request = new MetadataRequest {
                Topics = topics.ToList()
            };

            if (request.Topics.Count <= 0)
            {
                return(null);
            }

            var performRetry = false;
            var retryAttempt = 0;
            MetadataResponse metadataResponse = null;

            do
            {
                performRetry     = false;
                metadataResponse = GetMetadataResponse(connections, request);
                if (metadataResponse == null)
                {
                    return(null);
                }

                foreach (var validation in ValidateResponse(metadataResponse))
                {
                    switch (validation.Status)
                    {
                    case ValidationResult.Retry:
                        performRetry = true;
                        _log.WarnFormat(validation.Message);
                        break;

                    case ValidationResult.Error:
                        throw validation.Exception;
                    }
                }

                BackoffOnRetry(++retryAttempt, performRetry);
            } while (_interrupted == false && performRetry);

            return(metadataResponse);
        }
        private MetadataResponse GetMetadataResponse(IKafkaConnection[] connections, MetadataRequest request)
        {
            //try each default broker until we find one that is available
            foreach (var conn in connections)
            {
                try
                {
                    var response = conn.SendAsync(request).Result;
                    if (response != null && response.Count > 0)
                    {
                        return(response.FirstOrDefault());
                    }
                }
                catch (Exception ex)
                {
                    _log.WarnFormat("Failed to contact Kafka server={0}.  Trying next default server.  Exception={1}", conn.Endpoint, ex);
                }
            }

            throw new ServerUnreachableException(
                      "Unable to query for metadata from any of the default Kafka servers.  At least one provided server must be available.  Server list: {0}",
                      string.Join(", ", connections.Select(x => x.ToString())));
        }