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