我是否可以使MassTransit重用消费者实例而不是为每条消息创建一个新实例?

时间:2014-08-11 23:24:43

标签: performance masstransit

我是(直到今天)假设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实例?或者我是否需要假设将为每个请求创建消费者,并为每个消费者实例创建提取更重的设置工作?

1 个答案:

答案 0 :(得分:2)

当然,这很容易。因此Consumer方法注册了一个工厂,或Func返回消费者。因此,您可以拥有MyConsume和_myConsumer的私有实例,而不是new MyConsumer()。或者,如果您使用的是容器,则可以在容器中设置生命周期。