【问题标题】:How costly it is to create a new IModel instance in RabbitMQ在 RabbitMQ 中创建一个新的 IModel 实例的成本是多少
【发布时间】:2018-07-03 11:45:07
【问题描述】:

我正在使用 RabbitMQ .Net 核心客户端,并且我有许多消费者在使用相同的消息。

消费者不应该等待对方完成,所以我在一个新线程中为每个人提供午餐。

我在 IOC 中将 IModel 注册为单例

 services.AddSingleton(mb =>
        {
            var factory = new ConnectionFactory
            {
                HostName = HostName,
                UserName = Username,
                Password = Password,
                VirtualHost = VirtualHost
            };
            var connection = factory.CreateConnection();
            return connection.CreateModel();
        }); 

但是如果我启动我的应用程序并且队列已经包含消息,我会收到以下异常:

“禁止请求流水线”

我搜索了这个问题,似乎我无法将同一个 IModel 实例传递给多个线程。

要解决这个问题,我有两个解决方案,要么将 IModel 注册为瞬态,要么在我使用 IModel 实例时使用lock

我的问题是:每当需要 IModel 时,拥有一个新的 IModel 实例的成本是多少,因此每次请求 IModel 时都会启动与 RabbitMQ 的新连接?

在使用 IModel 实例时是否值得使用锁?

【问题讨论】:

标签: c# .net rabbitmq


【解决方案1】:

每当 IModel 存在时,拥有一个新的 IModel 实例的成本是多少 需要

我非常有信心该性能适合您的应用程序。如果您需要证明某些事情,可以运行基准测试。

...因此每次都会启动到 RabbitMQ 的新连接 请求 IModel?

您认为为什么会这样?您是否在端口 5672 上运行过 Wireshark 以查看调用 CreateModel 时实际发生的情况?

剧透警告:CreateConnection 是创建连接的原因,CreateModel 在该连接上打开一个通道。您不能在线程之间共享 IModel 实例是正确的,因此为每个线程创建一个。它会足够快!

RabbitMQ 团队会监控the rabbitmq-users mailing list,但有时只会在 StackOverflow 上回答问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 2017-02-25
    • 1970-01-01
    • 2014-04-27
    • 2011-02-11
    • 2012-11-28
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多