private IDictionary <string, QueueProperties> GetQueuesProperties()
        {
            var config = _options.ToAdminProperties();

            try
            {
                using (var admin = new AdminClientBuilder(config).Build())
                {
                    var meta  = admin.GetMetadata(_options.AdminRequestTimeout);
                    var props = from kafkaTopic in meta.Topics
                                join userTopic in _options.Topics on kafkaTopic.Topic equals userTopic.Name
                                from partition in kafkaTopic.Partitions
                                select new QueueProperties(
                        userTopic.Name,
                        (uint)partition.PartitionId,
                        userTopic.IsExternal
                        );

                    return(props.ToDictionary(prop => prop.QueueName));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to retrieve Kafka meta data. {@config}", config);
                throw;
            }
        }
        public KafkaAdapterFactory(
            string name,
            KafkaStreamOptions options,
            SimpleQueueCacheOptions cacheOptions,
            SerializationManager serializationManager,
            ILoggerFactory loggerFactory,
            IGrainFactory grainFactory,
            IExternalStreamDeserializer externalDeserializer
            )
        {
            _options = options ?? throw new ArgumentNullException(nameof(options));

            _name = name;
            _serializationManager = serializationManager;
            _loggerFactory        = loggerFactory;
            _grainFactory         = grainFactory;
            _externalDeserializer = externalDeserializer;
            _logger      = loggerFactory.CreateLogger <KafkaAdapterFactory>();
            _adminConfig = new AdminClientBuilder(options.ToAdminProperties());

            if (options.Topics != null && options.Topics.Count == 0)
            {
                throw new ArgumentNullException(nameof(options.Topics));
            }

            _adapterCache = new SimpleQueueAdapterCache(
                cacheOptions,
                name,
                loggerFactory
                );

            _queueProperties   = GetQueuesProperties().ToDictionary(q => q.QueueName);
            _streamQueueMapper = new ExternalQueueMapper(_queueProperties.Values);

            _config = _options.ToAdminProperties();
        }