示例#1
0
        private static async Task RunTest(SendOptions sendOptions, ReceiveOptions receiveOptions, TableControl tableControl)
        {
            var result = await PerformanceTest.RunTest(sendOptions, receiveOptions);

            var text = $"send msgs at {sendOptions.MessageSizeKilobytes} kilobytes in size";

            if (result == null)
            {
                Console.WriteLine($"Test failed: {text}");
            }

            var messagesSentPerSecond = result.MessageSentTimes.MessagesSentCounter.Value / result.MessageSentTimes.MessageSentTimePerTimePeriod.TotalSeconds;

            var messagesReceivedPerSecond = result.MessageReceivedTimes.MessagesReceivedCounter.Value / result.MessageReceivedTimes.MessageRecievedTimePerTimePeriod.Elapsed.TotalSeconds;

            tableControl.AddRow(new List <TableCellControl>()
            {
                new TableCellControl(text),
                new TableCellControl($"{sendOptions.MaxDegreeOfParallelism}"),
                new TableCellControl($"{messagesSentPerSecond}"),
                new TableCellControl($"{receiveOptions.RebusNumberOfWorkers}"),
                new TableCellControl($"{receiveOptions.RebusMaxParallelism}"),
                new TableCellControl($"{messagesReceivedPerSecond}"),
            });
        }
示例#2
0
        public static async Task <PerformanceTestResult> RunTest(SendOptions sendOptions, ReceiveOptions receiveOptions)
        {
            try
            {
                var stopwatch = new Stopwatch();
                stopwatch.Start();
                var performanceTest = new PerformanceTest();

                using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource())
                {
                    var receiver = await performanceTest.Receive(receiveOptions, cancellationTokenSource.Token);

                    using (receiver.Worker)
                    {
                        var send = await performanceTest.Send(sendOptions, cancellationTokenSource);

                        stopwatch.Stop();

                        receiver.MessageRecievedTimePerTimePeriod.Stop();

                        try
                        {
                            performanceTest.PurgeQueue();
                        }
                        catch (Exception e)
                        {
                            Logger.Logger.Error(e, "Error purging queue of extra records");
                        }

                        return(new PerformanceTestResult {
                            MessageReceivedTimes = receiver, MessageSentTimes = send, TotalTestTimeMilliseconds = stopwatch.ElapsedMilliseconds
                        });
                    }
                }
            }
            catch (Exception exception)
            {
                Logger.Logger.Error(exception, "Error running test");
            }

            return(null);
        }
示例#3
0
        private async Task <ReceiveResult> Receive(ReceiveOptions receiveOptions, CancellationToken cancellationToken)
        {
            Stopwatch sw = new Stopwatch();

            Counter MessagesReceivedCounter = new Counter();

            var workerBuiltinHandlerActivator = new BuiltinHandlerActivator();

            try
            {
                workerBuiltinHandlerActivator.Handle <PerformanceTestMessage>(message =>
                {
                    try
                    {
                        if (cancellationToken.IsCancellationRequested)
                        {
                            return(Task.CompletedTask);
                        }

                        if (Interlocked.Exchange(ref receivedMessage, 1) == 0)
                        {
                            sw.Start();
                        }

                        var now          = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                        var milliseconds = now > message.UnixTimeMilliseconds ? now - message.UnixTimeMilliseconds : message.UnixTimeMilliseconds - now;

                        if (milliseconds <= 0)
                        {
                            throw new Exception($"Time not correct {nameof(milliseconds)}:{milliseconds}");
                        }
                    }
                    catch (Exception error)
                    {
                        Logger.Logger.Error(error, "Error in PerformanceTestMessage handler");
                    }
                    finally
                    {
                        MessagesReceivedCounter.Increment();
                    }

                    return(Task.CompletedTask);
                });



                var worker = Configure
                             .With(workerBuiltinHandlerActivator)
                             .Logging(configurer => configurer.Serilog(Logger.Logger))
                             .Transport(t =>
                {
                    // set the worker queue name
                    t.UseAmazonSnsAndSqs(workerQueueAddress: QueueName);
                }).Routing(r =>
                {
                    // Map the message type to the queue
                    r.TypeBased().Map <PerformanceTestMessage>(QueueName);
                }).Options(configurer =>
                {
                    configurer.SetMaxParallelism(receiveOptions.RebusMaxParallelism);
                    configurer.SetNumberOfWorkers(receiveOptions.RebusNumberOfWorkers);
                }).Start();


                await worker.Subscribe <PerformanceTestMessage>();
            }
            catch (Exception error)
            {
                Logger.Logger.Error(error, "Error starting up worker");
            }

            var result = await Task.FromResult(new ReceiveResult { Worker = workerBuiltinHandlerActivator, MessageRecievedTimePerTimePeriod = sw, MessagesReceivedCounter = MessagesReceivedCounter, ReceiveOptions = receiveOptions });

            return(result);
        }