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();
                }
            }
        }
Beispiel #2
0
        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);
            }
        }