Masstransit 使用 RabbitMQ 性能很慢?

Masstransit use RabbitMQ is very slow performance?(Masstransit 使用 RabbitMQ 性能很慢?)
本文介绍了Masstransit 使用 RabbitMQ 性能很慢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我在没有 Masstransit 的情况下使用 RabbitMQ,每秒发送 10,000 条消息和 100 秒内发送 100 万条消息.

I used RabbitMQ without Masstransit and send 10,000 message/per sec and One million message in 100 second.

但是在将 Masstransit 与 RabbitMQ 一起使用后,我的机器上的性能非常低.

But after using Masstransit with RabbitMQ the performance is very low in my machine.

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

The hard disk is very active (99% usage) when publish/consume message and CPU activity for this process is almost 0%.

当使用此代码运行发布者/订阅者控制台应用程序时:

When the run Publisher/Subscriber console application with this code :

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 => { });
}

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

Published 100 message in 6 second and I don't know why is very slow.

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

My machine's configuration and software version is:

Windows 8.1 64 位

Windows 8.1 64bit

英特尔酷睿 i3 3.30GHz

Intel Core i3 3.30GHz

内存 8GB

Visual Studio 2013 C#.Net 4.5.1

Visual Studio 2013 C#.Net 4.5.1

Erlang 6.3

RabbitMQ 3.4.4

RabbitMQ 3.4.4

捷运 2.9.9

RabbitMQ.Client 3.4.0

RabbitMQ.Client 3.4.0

推荐答案

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

This is because under the covers, MassTransit is waiting for RabbitMQ to Ack the message, ensuring that it was successfully accepted by the broker before returning to the caller. Without this wait, if the broker fails to receive the write, the message could be lost.

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

With MassTransit v3 (currently in pre-release), the Publish method (and all Send methods) are now async, returning a Task that can be awaited (or not, if you don't care about the outcome).

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

I could add a PublishAsync method for .NET 4.0 developers to version 2.9.9, in fact, that's what I may end up doing as a temporary workaround for applications still using the current stable version. It may also be useful to add a NoWait option to the SendContext, allowing the application to opt-out of the Ack wait behavior.

老实说,在我的用例中,我只是更喜欢持久性而不是性能.

I just favor durability over performance in my use case, honestly.

这篇关于Masstransit 使用 RabbitMQ 性能很慢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

Force JsonConvert.SerializeXmlNode to serialize node value as an Integer or a Boolean(强制 JsonConvert.SerializeXmlNode 将节点值序列化为整数或布尔值)
Using JSON to Serialize/Deserialize TimeSpan(使用 JSON 序列化/反序列化 TimeSpan)
Could not determine JSON object type for type quot;Classquot;(无法确定类型“Class的 JSON 对象类型.)
How to deserialize a JSONP response (preferably with JsonTextReader and not a string)?(如何反序列化 JSONP 响应(最好使用 JsonTextReader 而不是字符串)?)
how to de-serialize JSON data in which Timestamp it-self contains fields?(如何反序列化时间戳本身包含字段的JSON数据?)
JSON.Net custom contract serialization and Collections(JSON.Net 自定义合约序列化和集合)