private IProducer <byte[], byte[]> CreateEOSProducer() { IProducer <byte[], byte[]> tmpProducer = null; var newConfig = configuration.Clone(); log.Info($"${logPrefix}Creating producer client for task {Id}"); newConfig.TransactionalId = $"{newConfig.ApplicationId}-{Id}"; tmpProducer = kafkaSupplier.GetProducer(newConfig.ToProducerConfig(StreamThread.GetTaskProducerClientId(threadId, Id))); return(tmpProducer); }
internal static IThread Create(string threadId, string clientId, InternalTopologyBuilder builder, StreamMetricsRegistry streamMetricsRegistry, IStreamConfig configuration, IKafkaSupplier kafkaSupplier, IAdminClient adminClient, int threadInd) { string logPrefix = $"stream-thread[{threadId}] "; var log = Logger.GetLogger(typeof(StreamThread)); var customerID = $"{clientId}-StreamThread-{threadInd}"; IProducer <byte[], byte[]> producer = null; // TODO : remove this limitations depends version of Kafka Cluster // Due to limitations outlined in KIP-447 (which KIP-447 overcomes), it is // currently necessary to use a separate producer per input partition. The // producerState dictionary is used to keep track of these, and the current // consumed offset. // https://cwiki.apache.org/confluence/display/KAFKA/KIP-447%3A+Producer+scalability+for+exactly+once+semantics // IF Guarantee is AT_LEAST_ONCE, producer is the same of all StreamTasks in this thread, // ELSE one producer by StreamTask. if (configuration.Guarantee == ProcessingGuarantee.AT_LEAST_ONCE) { log.LogInformation("{LogPrefix}Creating shared producer client", logPrefix); producer = kafkaSupplier.GetProducer(configuration.ToProducerConfig(GetThreadProducerClientId(threadId)).Wrap(threadId)); } var restoreConfig = configuration.ToConsumerConfig(GetRestoreConsumerClientId(customerID)); restoreConfig.GroupId = $"{configuration.ApplicationId}-restore-group"; var restoreConsumer = kafkaSupplier.GetRestoreConsumer(restoreConfig); var storeChangelogReader = new StoreChangelogReader( configuration, restoreConsumer, threadId, streamMetricsRegistry); var taskCreator = new TaskCreator(builder, configuration, threadId, kafkaSupplier, producer, storeChangelogReader, streamMetricsRegistry); var manager = new TaskManager(builder, taskCreator, adminClient, storeChangelogReader); var listener = new StreamsRebalanceListener(manager); log.LogInformation("{LogPrefix}Creating consumer client", logPrefix); var consumer = kafkaSupplier.GetConsumer(configuration.ToConsumerConfig(GetConsumerClientId(customerID)).Wrap(threadId), listener); manager.Consumer = consumer; var thread = new StreamThread(threadId, customerID, manager, consumer, builder, storeChangelogReader, streamMetricsRegistry, configuration); listener.Thread = thread; return(thread); }
internal static IThread Create(string threadId, string clientId, InternalTopologyBuilder builder, IStreamConfig configuration, IKafkaSupplier kafkaSupplier, IAdminClient adminClient, int threadInd) { string logPrefix = $"stream-thread[{threadId}] "; var log = Logger.GetLogger(typeof(StreamThread)); var customerID = $"{clientId}-StreamThread-{threadInd}"; IProducer <byte[], byte[]> producer = null; // Due to limitations outlined in KIP-447 (which KIP-447 overcomes), it is // currently necessary to use a separate producer per input partition. The // producerState dictionary is used to keep track of these, and the current // consumed offset. // https://cwiki.apache.org/confluence/display/KAFKA/KIP-447%3A+Producer+scalability+for+exactly+once+semantics // IF Guarantee is AT_LEAST_ONCE, producer is the same of all StreamTasks in this thread, // ELSE one producer by StreamTask. if (configuration.Guarantee == ProcessingGuarantee.AT_LEAST_ONCE) { log.Info($"{logPrefix}Creating shared producer client"); producer = kafkaSupplier.GetProducer(configuration.ToProducerConfig(GetThreadProducerClientId(threadId))); } var taskCreator = new TaskCreator(builder, configuration, threadId, kafkaSupplier, producer); var manager = new TaskManager(builder, taskCreator, adminClient); var listener = new StreamsRebalanceListener(manager); log.Info($"{logPrefix}Creating consumer client"); var consumer = kafkaSupplier.GetConsumer(configuration.ToConsumerConfig(customerID), listener); manager.Consumer = consumer; var thread = new StreamThread(threadId, customerID, manager, consumer, builder, TimeSpan.FromMilliseconds(configuration.PollMs), configuration.CommitIntervalMs); listener.Thread = thread; return(thread); }