public IProducer <string, byte[]> CreateProducer(ClusterSettings clusterSettings, TopicProducerSettings topicProducerSettings)
        {
            if (topicProducerSettings == null)
            {
                throw new ArgumentNullException(nameof(topicProducerSettings));
            }

            if (!topicProducerSettings.Enabled)
            {
                return(null);
            }

            var config = clusterSettings.ToClientConfig <ProducerConfig>(c =>
            {
                c.Acks = (Acks?)topicProducerSettings.Acks;
            });

            var builder = new ProducerBuilder <string, byte[]>(config)
                          .SetKeySerializer(Utf8Serializer.Instance);

            if (CompressionHandlerFactory.ResolveCompressionHandler(topicProducerSettings.MessageCompressionType, out var compressionHandler))
            {
                builder.SetValueSerializer(compressionHandler);
            }

            var producer = builder.Build();

            this.producers.Add(producer);

            return(producer);
        }
        public IConsumer <string, byte[]> CreateConsumer(ClusterSettings clusterSettings, TopicConsumerSettings topicConsumerSettings)
        {
            if (topicConsumerSettings == null)
            {
                throw new ArgumentNullException(nameof(topicConsumerSettings));
            }

            if (!topicConsumerSettings.Enabled)
            {
                return(null);
            }

            var config = clusterSettings.ToClientConfig <ConsumerConfig>(c =>
            {
                c.GroupId          = topicConsumerSettings.GroupId;
                c.AutoOffsetReset  = (AutoOffsetReset)topicConsumerSettings.AutoOffsetReset;
                c.EnableAutoCommit = false;
            });

            var builder = new ConsumerBuilder <string, byte[]>(config)
                          .SetLogHandler(this.OnLog)
                          .SetErrorHandler(this.OnError)
                          .SetStatisticsHandler(this.OnStatistics)
                          .SetOffsetsCommittedHandler(this.OnCommitted)
                          .SetPartitionsRevokedHandler((c, tpo) => this.OnPartitionsRevoked(c, tpo))
                          .SetPartitionsAssignedHandler((c, tpo) => this.OnPartitionsAssigned(c, tpo))
                          .SetKeyDeserializer(Utf8Serializer.Instance);

            if (CompressionHandlerFactory.ResolveCompressionHandler(topicConsumerSettings.MessageCompressionType, out var compressionHandler))
            {
                builder.SetValueDeserializer(compressionHandler);
            }

            var consumer = builder.Build();

            this.consumers.Add(consumer);

            return(consumer);
        }