private async Task PublisherLoop() { var batch = new ProducerBatchMessage(); while (true) { if (_publisherChannel.Reader.TryRead(out var produceMessage)) { var message = produceMessage.Message; var taskCompletionSource = produceMessage.TaskCompletionSource; batch.Envelopes.Add(message); batch.DeliveryReports.Add(taskCompletionSource); if (batch.Envelopes.Count < _batchSize) { continue; } await PublishBatch(batch); batch = new ProducerBatchMessage(); } else { if (batch.Envelopes.Count > 0) { await PublishBatch(batch); batch = new ProducerBatchMessage(); } await _publisherChannel.Reader.WaitToReadAsync(); } } }
public async Task PublishBatch(ProducerBatchMessage batch) { //TODO: retries etc... await _cluster.RequestAsync <PublishResponse>(_topic, "topic", batch, CancellationTokens.FromSeconds(5)); foreach (var tcs in batch.DeliveryReports) { tcs.SetResult(true); } }