在RabbitMQ中创建一个新的IModel示例的成本有多高

mzaanser  于 8个月前  发布在  RabbitMQ
关注(0)|答案(1)|浏览(62)

我正在使用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注册为 transient ,要么在使用IModel示例时使用lock
我的问题是:每当需要IModel时,拥有一个新的IModel示例的成本有多大,因此每次请求IModel时都会启动一个到RabbitMQ的新连接?
在使用IModel示例时是否值得使用锁?

njthzxwz

njthzxwz1#

每当需要IModel时,拥有一个新的IModel示例的成本有多高
我很有信心,性能是罚款为您的应用程序。如果你需要证明什么,可以运行基准测试。
.因此,每次请求IModel时都会启动一个新的RabbitMQ连接?
为什么你认为是这样的?您是否在5672端口上运行了Wireshark,以查看调用CreateModel时实际发生了什么?
剧透提醒:CreateConnection创建一个连接,CreateModel在该连接上打开一个通道。你说的没错,你不能在线程之间共享IModel示例,所以每个线程创建一个。它会足够快!

相关问题