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
这是因为在封面下,MassTransit正在等待RabbitMQ Ack
消息,确保它在返回调用者之前被代理成功接受.如果没有这种等待,如果代理无法接收写入,则消息可能会丢失.
使用MassTransit v3(当前处于预发布状态),Publish
方法(以及所有Send
方法)现在都是异步的,返回Task
可以等待的(或者不是,如果你不关心结果).
我可以PublishAsync
为.NET 4.0开发人员添加一个2.9.9版本的方法,事实上,这也是我最终可能作为仍在使用当前稳定版本的应用程序的临时解决方法.向应用程序添加NoWait
选项可能也很有用SendContext
,允许应用程序选择退出Ack
等待行为.
老实说,我只是喜欢耐用性而不是性能.
我在 MT2 <= 2.10.1 中发现了一个错误,它阻止它正确处理WaitForAck
标志。我发布了一个补丁提案,希望 Chris 尽快发布 2.10.2。
此处描述了有关该问题的详细信息:
https://groups.google.com/forum/#!topic/masstransit-discuss/XiqSDnJzd8U
简而言之,问题是由SendContext
复制构造函数中的错误引起的,尽管原始上下文将等待 ack 标志设置为false
,但调用中使用的上下文始终将标志设置为true
。