Каковы издержки Masstransit при работе на RabbitMQ? - PullRequest
0 голосов
/ 25 апреля 2019

При использовании Masstransit с RabbitMQ я вижу неутешительные результаты. Доставить / получить капли до 0,20 / сек. Я начал исследовать эту проблему с помощью простого тестового приложения. Это приложение параллельно запускает поток, отправляющий сообщения в RabbitMQ, используя клиентскую библиотеку RabbitMQ, и поток, использующий библиотеку Masstransit, отправляющую то же сообщение в RabbitMQ. Клиентская библиотека RabbitMQ может отправлять в 10 раз больше сообщений, чем библиотека Masstransit.

RabbitMQ работает в контейнере Docker на машине HyperV. Флаг PublishConfirm Masstransit имеет некоторый эффект, но не так сильно. Чтобы получить достоверное сравнение, определена та же топология для случая RabbitMQ, которая используется в случае Masstransit.

Массранзит код:

        public MasstransitMessageSender(string user, string password, string rabbitMqHost)
        {
            this.user = user;
            this.password = password;
            this.rabbitMqHost = rabbitMqHost;
        }

        public RabbitMqMessageSender(string user, string password, string rabbitMqHost)
        {
            var myUri = new Uri(rabbitMqHost);

            this.factory = new ConnectionFactory
            {
                HostName = myUri.Host,
                UserName = user,
                Password = password,
                VirtualHost = myUri.LocalPath,
                Port = (myUri.Port > 0 ? myUri.Port : -1),
                AutomaticRecoveryEnabled = true
            };
        }

        public Task SendCommands(int numberOfMessages)
        {
            return Task.Run(() =>
            {
                var busControl = global::MassTransit.Bus.Factory.CreateUsingRabbitMq(
                    sbc =>
                    {
                        // Host control
                        var host =
                            sbc.Host(
                                new Uri(this.rabbitMqHost),
                                h =>
                                {
                                    h.Username(this.user);
                                    h.Password(this.password);
                                    h.Heartbeat(60);
                                    h.PublisherConfirmation = false;
                                });
                    });

                busControl.StartAsync().Wait();
                var task = busControl.GetSendEndpoint(new Uri(this.rabbitMqHost + "/MasstransitService"));
                var tasks = new List<Task>();

                task.Wait();
                var endpoint = task.Result;
                for (var i = 0; i < numberOfMessages; i++)
                {
                    tasks.Add(endpoint.Send<IMyMessage>(new
                    {
                        Number = i,
                        Description = "MyMessage"
                    }));
                }

                Task.WaitAll(tasks.ToArray());
            });
        }

код RabbitMQ:

        public RabbitMqMessageSender(string user, string password, string rabbitMqHost)
        {
            var myUri = new Uri(rabbitMqHost);

            this.factory = new ConnectionFactory
            {
                HostName = myUri.Host,
                UserName = user,
                Password = password,
                VirtualHost = myUri.LocalPath,
                Port = (myUri.Port > 0 ? myUri.Port : -1),
                AutomaticRecoveryEnabled = true
            };
        }

        public Task SendCommands(int numberOfMessages)
        {
            return Task.Run(() =>
            {
                using (var connection = this.factory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        var messageProperties = channel.CreateBasicProperties();
                        channel.ExchangeDeclare("PerformanceConsole:ShowRabbitMqMessage", "fanout", true, false, null);
                        channel.ExchangeDeclare("RabbitMqService", "fanout", true, false, null);
                        channel.QueueDeclare("RabbitMqService", true, false, false, null);
                        channel.ExchangeBind("RabbitMqService", "PerformanceConsole:ShowRabbitMqMessage", "", null);
                        channel.QueueBind("RabbitMqService", "RabbitMqService", "", null);
                        for (var i = 0; i < numberOfMessages; i++)
                        {
                            var bericht = new
                            {
                                Volgnummer = 1,
                                Tekst = "Bericht"
                            };
                            var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(bericht));
                                channel.BasicPublish("RabbitMqService", "", messageProperties, body);
                        }
                    }
                }
            });
        }

На панели инструментов RabbitMQ отображаются следующие показатели:

Masstransit входящих 664 мсг / с RabbitMQ входящий 6764 мсг / с

Я ожидал, что входящие тарифы будут в том же диапазоне.

Возможно, я допустил ошибку в конфигурации, предложения приветствуются.

1 Ответ

0 голосов
/ 25 апреля 2019

Используя MassTransit-Benchmark, я получаю следующую производительность на своем MacBook Pro 2015, используя netcoreapp2.2 на OS X.

PhatBoyG-Pro15:MassTransit-Benchmark Chris$ dotnet run -f netcoreapp2.2 -- --clients=50 --count=50000 --prefetch=100
MassTransit Benchmark

Transport: RabbitMQ
Host: localhost
Virtual Host: /
Username: guest
Password: *****
Heartbeat: 0
Publisher Confirmation: False
Running Message Latency Benchmark
Message Count: 50000
Clients: 50
Durable: False
Payload Length: 0
Prefetch Count: 100
Concurrency Limit: 0
Total send duration: 0:00:05.2250045
Send message rate: 9569.37 (msg/s)
Total consume duration: 0:00:07.2385114
Consume message rate: 6907.50 (msg/s)
Concurrent Consumer Count: 8
Avg Ack Time: 4ms
Min Ack Time: 0ms
Max Ack Time: 251ms
Med Ack Time: 4ms
95t Ack Time: 6ms
Avg Consume Time: 1431ms
Min Consume Time: 268ms
Max Consume Time: 2075ms
Med Consume Time: 1639ms
95t Consume Time: 2070ms

Вы можете скачать тест и запустить его самостоятельно: https://github.com/MassTransit/MassTransit-Benchmark

...