我是(直到今天)假设MassTransit ServiceBusFactory的订阅(如下所示)将负责在启动时创建消费者,并且如果他们死亡可能会重新创建消费者,但是一旦事情起来并且运行更多的消费者就会不是在飞行中创建的。
我今天正在进行一些性能调优,并发现我的Consumer构造函数正在被调用似乎每条消息。
这是我正在使用的示例Start()方法,它注册了Consumer订阅(硬编码为1个消费者进行测试)。
static void Start()
{
var consumerLimit = ConfigurationProvider.GetSetting("ConsumerLimit", Math.Min(2, Environment.ProcessorCount));
var controlQueueUri = ConfigurationProvider.GetServiceBusUriFromSetting("ControlQueueName");
_bus = ServiceBusFactory.New(x =>
{
x.UseRabbitMq(rmq => rmq.ConfigureRabbitMqHost(ConfigurationProvider));
x.ReceiveFrom(controlQueueUri);
x.SetConcurrentConsumerLimit(1);
x.SetCreateMissingQueues(true);
x.UseNLog();
x.DisablePerformanceCounters();
x.Validate();
x.Subscribe(s => s.Consumer(() =>
new MyConsumer()
);
});
}
有没有办法告诉MassTransit重用这些Consumer实例?或者我是否需要假设将为每个请求创建消费者,并为每个消费者实例创建提取更重的设置工作?
答案 0 :(得分:2)
当然,这很容易。因此Consumer
方法注册了一个工厂,或Func
返回消费者。因此,您可以拥有MyConsume和_myConsumer
的私有实例,而不是new MyConsumer()
。或者,如果您使用的是容器,则可以在容器中设置生命周期。