我(直到今天)假设 MassTransit ServiceBusFactory 的 Subscribe(如下所用)将在启动时负责创建消费者,并且如果消费者消失,可能会重新创建它们,但是一旦事情启动并运行,更多的消费者就会不是即时创建的。
我今天正在做一些性能调整,发现我的 Consumer 构造函数正在被调用以处理似乎每条消息。
这是我正在使用的 Start() 方法示例,用于注册消费者订阅(硬编码为 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 实例?或者我是否需要假设将为每个请求创建消费者,并从为每个消费者实例创建运行中提取更繁重的设置工作?
最佳答案
当然,这很简单。因此,Consumer
方法注册一个工厂,或返回消费者的 Func
。因此,您可以拥有 MyConsume 和 _myConsumer
的私有(private)实例,而不是 new MyConsumer()
。或者如果您使用的是容器,则可以在容器中设置生命周期。
关于performance - 我可以让 MassTransit 重用消费者实例,而不是为每条消息创建一个新实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25253954/