【发布时间】:2019-04-24 21:15:16
【问题描述】:
将 Masstransit 与 RabbitMQ 结合使用时,我看到了令人失望的性能。交付/获取下降到 0.20/秒。我开始用一个简单的测试应用程序来研究这个问题。此应用程序并行运行一个使用 RabbitMQ 客户端库向 RabbitMQ 发送消息的线程和一个使用 Masstransit 库向 RabbitMQ 发送相同消息的线程。 RabbitMQ 客户端库可以发送比 Masstransit 库多 10 倍的消息。
RabbitMQ 在 HyperV 机器的 Docker 容器中运行。 Masstransit 的 PublishConfirm 标志有一些影响,但影响不大。 为了获得公平的比较,为 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 msg/s RabbitMQ 传入 6764 msg/s
我希望收到的费率在同一范围内。
可能是我配置有误,欢迎提出建议。
【问题讨论】:
-
您可以使用基准工具进行更好的吞吐量测试:github.com/MassTransit/MassTransit-Benchmark - 增加客户端、预取和计数,您应该可以轻松获得可比较的性能。
-
您也没有使用 await 和其他异步构造,Task.WaitAll() 在 TPL 中表现不佳。
标签: performance rabbitmq masstransit