【问题标题】:Masstransit use RabbitMQ is very slow performance?Masstransit 使用 RabbitMQ 性能很慢?
【发布时间】:2015-04-20 12:53:33
【问题描述】:

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

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

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

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

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 条消息,我不知道为什么很慢。


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

Windows 8.1 64 位

英特尔酷睿 i3 3.30GHz

内存 8GB


Visual Studio 2013 C#.Net 4.5.1

Erlang 6.3

RabbitMQ 3.4.4

捷运 2.9.9

RabbitMQ.Client 3.4.0

【问题讨论】:

  • 仅供参考,MT 2.10 中添加了不等待 .NET 4.x 确认的功能。
  • 感谢克里斯·帕特森先生的回答。现在我会使用它。
  • @MohammadRadmanFar:你在这里成功了吗?我刚刚在 mt 讨论组 (groups.google.com/forum/#!topic/masstransit-discuss/XiqSDnJzd8U) 上发帖,因为我找不到解决此问题的方法。
  • @ChrisPatterson:克里斯,你有机会看看这个并发表评论吗?提前致谢。
  • 我看到的速度比你看到的要高得多。我怀疑还有其他东西让你慢下来。你有repro吗?您可以运行 MassTransit-Stress 应用程序来测试您的代理吞吐量吗?

标签: c# rabbitmq masstransit


【解决方案1】:

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

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

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

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

【讨论】:

  • 因为我几乎对自己做出了回答(事实证明一个简单的错误存在于资源中),我也不能将赏金奖励给任何人。然而,由于赏金已经设置,我决定将它奖励给你 Chris,作为对你在 MT 中付出的所有努力的感谢。继续努力,问候:)
  • 在我看来,masstransit 每次发布都会创建连接。如果使用 RabbitMq.Client 之类的东西,则会显式创建连接,因此当发布周期在连接内时 - 速度大约是上面的 5 倍。打开 ACK 后,它的速度与我 PC 上的 masstransit(大约 50 条消息/秒)差不多
  • 在发布消息之前应该启动总线,使用MassTransit的消息发布率可以轻松达到15,000+条消息。如果您在循环中发布,并等待每次调用 Publish,那么,那是您的错误。不要那样做,异步 101。
【解决方案2】:

我在 MT2 WaitForAck 标志。我发布了补丁提案,希望 Chris 尽快发布 2.10.2。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2023-04-06
    • 2016-07-16
    • 2019-03-22
    • 1970-01-01
    • 2023-02-23
    • 2013-04-20
    相关资源
    最近更新 更多