【发布时间】: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 实例时是否值得使用锁?
【问题讨论】: