Masstransit使用RabbitMQ是非常慢的性能?

Moh*_*Far 7 c# masstransit rabbitmq

我使用没有Masstransit的RabbitMQ,每秒发送10,000条消息,100秒内发送一百万条消息.

但在使用Masstransit与RabbitMQ后,我的机器性能非常低.

发布/使用消息时,硬盘非常活跃(使用率为99%),此过程的CPU活动几乎为0%.

使用此代码运行Publisher/Subscriber控制台应用程序时:

var bus = ServiceBusFactory.New(x =>
{
    x.UseRabbitMq();
    x.ReceiveFrom("rabbitmq://localhost/Example_Hello");
});
var message = new MyMessage() { Text = "hello", When = DateTime.Now };
for (int i = 0; i < 100; i++)
{
    bus.Publish<MyMessage>(message, x => { });
}
Run Code Online (Sandbox Code Playgroud)

在6秒内发布了100条消息,我不知道为什么会很慢.


我的机器的配置和软件版本是:

Windows 8.1 64位

英特尔酷睿i3 3.30GHz

内存8GB


Visual Studio 2013 C#.Net 4.5.1

Erlang 6.3

RabbitMQ 3.4.4

Masstransit 2.9.9

RabbitMQ.Client 3.4.0

Chr*_*son 8

这是因为在封面下,MassTransit正在等待RabbitMQ Ack消息,确保它在返回调用者之前被代理成功接受.如果没有这种等待,如果代理无法接收写入,则消息可能会丢失.

使用MassTransit v3(当前处于预发布状态),Publish方法(以及所有Send方法)现在都是异步的,返回Task可以等待的(或者不是,如果你不关心结果).

我可以PublishAsync为.NET 4.0开发人员添加一个2.9.9版本的方法,事实上,这也是我最终可能作为仍在使用当前稳定版本的应用程序的临时解决方法.向应用程序添加NoWait选项可能也很有用SendContext,允许应用程序选择退出Ack等待行为.

老实说,我只是喜欢耐用性而不是性能.

  • 因为我几乎回答了自己(事实证明,一个简单的错误来自源代码)我也不能将赏金奖励给任何人.然而,由于赏金已经建立,我决定将它奖励给你克里斯作为你在MT中投入的所有努力的代表.保持良好的工作,问候:) (2认同)

Wik*_*hla 5

我在 MT2 <= 2.10.1 中发现了一个错误,它阻止它正确处理WaitForAck标志。我发布了一个补丁提案,希望 Chris 尽快发布 2.10.2。

此处描述了有关该问题的详细信息:

https://groups.google.com/forum/#!topic/masstransit-discuss/XiqSDnJzd8U

简而言之,问题是由SendContext复制构造函数中的错误引起的,尽管原始上下文将等待 ack 标志设置为false,但调用中使用的上下文始终将标志设置为true