internal async Task<ProducerResponse> Produce(ProduceRequest request) { var conn = request.Broker.Conn; var client = await conn.GetClientAsync(); _log.Debug("Sending ProduceRequest to {0}, Request: {1}", conn, request); if(_etw.IsEnabled()) _etw.ProtocolProduceRequest(request.ToString(), request.Broker.NodeId); var response = await conn.Correlation.SendAndCorrelateAsync( id => Serializer.Serialize(request, id), Serializer.GetProducerResponse, client, CancellationToken.None ); _log.Debug("Got ProduceResponse: {0}", response); if (_etw.IsEnabled()) _etw.ProtocolProduceResponse(response.ToString(), request.Broker.NodeId); return response; }
internal async Task<ProducerResponse> SendBatchAsync(int leader, IEnumerable<Message> batch, Producer producer) { CheckConnected(); // TODO: do state checking. Introduce this.Connected task to wait if needed var request = new ProduceRequest { Broker = _metadata.Brokers.First(b => b.NodeId == leader), RequiredAcks = producer.Configuration.RequiredAcks, Timeout = producer.Configuration.ProduceRequestTimeoutMs, TopicData = new[] { new TopicData { TopicName = producer.Topic, PartitionsData = ( from msg in batch // group messages belonging to the same partition group msg by msg.PartitionId into partitionGrp select new PartitionData { Pub = producer, OriginalMessages = partitionGrp.ToArray(), Partition = partitionGrp.Key, Messages = ( from msg in partitionGrp select new MessageData { Key = msg.Key, Value = msg.Value } ) } ) } } }; var response = await _protocol.Produce(request).ConfigureAwait(false); _log.Debug("#{0} SendBatchAsync complete", _id); return response; }