Ejemplo n.º 1
0
        static async Task ReceiveMessages(string connectionString, int numPartitions, int numClients, bool verbose)
        {
            Console.WriteLine($"Receiving messages from {numPartitions} partitions using {numClients} client instances");

            var clients = new EventHubClient[numClients];

            for (var i = 0; i < numClients; i++)
            {
                clients[i] = new EventHubClient(connectionString, _eventHubName);
            }

            try
            {
                var client       = clients.First();
                var partitionIds = (await client.GetPartitionIdsAsync()).Take(numPartitions);
                var partitions   = await Task.WhenAll(partitionIds.Select(id => client.GetPartitionPropertiesAsync(id)));

                var totalCount = (long)0;
                foreach (var partition in partitions)
                {
                    var begin = partition.BeginningSequenceNumber;
                    var end   = partition.LastEnqueuedSequenceNumber;
                    var count = end - begin + 1;
                    totalCount += count;

                    if (verbose)
                    {
                        Console.WriteLine($"Partition: {partition.Id}, Begin: {begin}, End: {end}, Count: {count}");
                    }
                }
                if (verbose)
                {
                    Console.WriteLine($"Total Count: {totalCount}");
                }

                var consumers = new EventHubConsumer[numPartitions];
                for (var i = 0; i < numPartitions; i++)
                {
                    consumers[i] = clients[i % numClients].CreateConsumer(EventHubConsumer.DefaultConsumerGroupName, partitions[i].Id, EventPosition.Earliest);
                }

                try
                {
                    var receiveTasks = new Task <(int messagesReceived, long lastSequenceNumber)> [numPartitions];
                    var sw           = Stopwatch.StartNew();
                    for (var i = 0; i < numPartitions; i++)
                    {
                        receiveTasks[i] = ReceiveAllMessages(consumers[i], partitions[i]);
                    }
                    var results = await Task.WhenAll(receiveTasks);

                    sw.Stop();

                    var elapsed            = sw.Elapsed.TotalSeconds;
                    var messagesReceived   = results.Select(r => r.messagesReceived).Sum();
                    var messagesPerSecond  = messagesReceived / elapsed;
                    var megabytesPerSecond = (messagesPerSecond * _bytesPerMessage) / (1024 * 1024);

                    Console.WriteLine($"Received {messagesReceived} messages of size {_bytesPerMessage} in {elapsed:N2}s " +
                                      $"({messagesPerSecond:N2} msg/s, {megabytesPerSecond:N2} MB/s)");
                }