Add settings for MassTransit message handling (#5176)
* Added settings for increasing message handling throughput * Fixed automatic deletion of queues and exchanges in rabbitMQ
This commit is contained in:
parent
d146c5d938
commit
afb755cf52
|
|
@ -24,10 +24,12 @@ var azureServiceBusConnectionString = configuration.GetConnectionString("AzureSe
|
|||
var identitySection = configuration.GetSection("Identity");
|
||||
var identityTokenSection = identitySection.GetSection("Tokens");
|
||||
var massTransitSection = configuration.GetSection("MassTransit");
|
||||
var massTransitDispatcherSection = configuration.GetSection("MassTransit.Dispatcher");
|
||||
var heartbeatSection = configuration.GetSection("Heartbeat");
|
||||
const MassTransitBroker useMassTransitBroker = MassTransitBroker.Memory;
|
||||
const MassTransitBroker useMassTransitBroker = MassTransitBroker.AzureServiceBus;
|
||||
|
||||
services.Configure<MassTransitWorkflowDispatcherOptions>(massTransitSection);
|
||||
services.Configure<MassTransitOptions>(massTransitSection);
|
||||
services.Configure<MassTransitWorkflowDispatcherOptions>(massTransitDispatcherSection);
|
||||
|
||||
// Add Elsa services.
|
||||
services
|
||||
|
|
@ -87,28 +89,14 @@ services
|
|||
{
|
||||
elsa.UseMassTransit(massTransit =>
|
||||
{
|
||||
if (useMassTransitBroker == MassTransitBroker.AzureServiceBus)
|
||||
switch (useMassTransitBroker)
|
||||
{
|
||||
massTransit.UseAzureServiceBus(azureServiceBusConnectionString, serviceBusFeature => serviceBusFeature.ConfigureServiceBus = bus =>
|
||||
{
|
||||
bus.PrefetchCount = 4;
|
||||
bus.LockDuration = TimeSpan.FromMinutes(5);
|
||||
bus.MaxConcurrentCalls = 32;
|
||||
bus.MaxDeliveryCount = 8;
|
||||
// etc.
|
||||
});
|
||||
}
|
||||
|
||||
if (useMassTransitBroker == MassTransitBroker.RabbitMq)
|
||||
{
|
||||
massTransit.UseRabbitMq(rabbitMqConnectionString, rabbit => rabbit.ConfigureServiceBus = bus =>
|
||||
{
|
||||
bus.PrefetchCount = 4;
|
||||
bus.Durable = true;
|
||||
bus.AutoDelete = false;
|
||||
bus.ConcurrentMessageLimit = 32;
|
||||
// etc.
|
||||
});
|
||||
case MassTransitBroker.AzureServiceBus:
|
||||
massTransit.UseAzureServiceBus(azureServiceBusConnectionString);
|
||||
break;
|
||||
case MassTransitBroker.RabbitMq:
|
||||
massTransit.UseRabbitMq(rabbitMqConnectionString);
|
||||
break;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
|
|
|||
|
|
@ -66,7 +66,13 @@
|
|||
"Timeout": "00:00:05:00"
|
||||
},
|
||||
"MassTransit": {
|
||||
"TemporaryQueueTtl": "00:00:05:00"
|
||||
"TemporaryQueueTtl": "00:00:05:00",
|
||||
"ConcurrentMessageLimit": 4,
|
||||
"PrefetchCount": 4,
|
||||
"MaxAutoRenewDuration": "00:00:00:30",
|
||||
"Dispatcher": {
|
||||
"ConcurrentMessageLimit": 4
|
||||
}
|
||||
},
|
||||
"Smtp": {
|
||||
"Host": "localhost",
|
||||
|
|
|
|||
|
|
@ -73,10 +73,17 @@ public class AzureServiceBusFeature : FeatureBase
|
|||
if (ConnectionString != null)
|
||||
configurator.Host(ConnectionString);
|
||||
|
||||
var options = context.GetRequiredService<IOptions<MassTransitOptions>>().Value;
|
||||
|
||||
if (options.PrefetchCount is not null)
|
||||
configurator.PrefetchCount = options.PrefetchCount.Value;
|
||||
if (options.MaxAutoRenewDuration is not null)
|
||||
configurator.MaxAutoRenewDuration = options.MaxAutoRenewDuration.Value;
|
||||
configurator.ConcurrentMessageLimit = options.ConcurrentMessageLimit;
|
||||
|
||||
configurator.UseServiceBusMessageScheduler();
|
||||
configurator.SetupWorkflowDispatcherEndpoints(context);
|
||||
ConfigureServiceBus?.Invoke(configurator);
|
||||
var options = context.GetRequiredService<IOptions<MassTransitWorkflowDispatcherOptions>>().Value;
|
||||
var instanceNameProvider = context.GetRequiredService<IApplicationInstanceNameProvider>();
|
||||
|
||||
foreach (var consumer in temporaryConsumers)
|
||||
|
|
|
|||
|
|
@ -56,24 +56,27 @@ public class RabbitMqServiceBusFeature : FeatureBase
|
|||
|
||||
configure.UsingRabbitMq((context, configurator) =>
|
||||
{
|
||||
var options = context.GetRequiredService<IOptions<MassTransitWorkflowDispatcherOptions>>().Value;
|
||||
var options = context.GetRequiredService<IOptions<MassTransitOptions>>().Value;
|
||||
var instanceNameProvider = context.GetRequiredService<IApplicationInstanceNameProvider>();
|
||||
|
||||
if (!string.IsNullOrEmpty(ConnectionString))
|
||||
configurator.Host(ConnectionString);
|
||||
|
||||
if (options.PrefetchCount is not null)
|
||||
configurator.PrefetchCount = options.PrefetchCount.Value;
|
||||
configurator.ConcurrentMessageLimit = options.ConcurrentMessageLimit;
|
||||
|
||||
ConfigureServiceBus?.Invoke(configurator);
|
||||
|
||||
foreach (var consumer in temporaryConsumers)
|
||||
{
|
||||
configure.AddConsumer(consumer.ConsumerType).ExcludeFromConfigureEndpoints();
|
||||
|
||||
configurator.ReceiveEndpoint($"{instanceNameProvider.GetName()}-{consumer.Name}",
|
||||
endpointConfigurator =>
|
||||
{
|
||||
endpointConfigurator.QueueExpiration = options.TemporaryQueueTtl ?? TimeSpan.FromHours(1);
|
||||
endpointConfigurator.ConcurrentMessageLimit = options.ConcurrentMessageLimit;
|
||||
|
||||
endpointConfigurator.Durable = false;
|
||||
endpointConfigurator.AutoDelete = true;
|
||||
endpointConfigurator.ConfigureConsumer(context, consumer.ConsumerType);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ public class MassTransitFeature : FeatureBase
|
|||
}
|
||||
|
||||
/// The number of messages to prefetch.
|
||||
[Obsolete("PrefetchCount has been moved to be included in MassTransitOptions")]
|
||||
public int? PrefetchCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -56,6 +57,7 @@ public class MassTransitFeature : FeatureBase
|
|||
var messageTypes = this.GetMessages();
|
||||
|
||||
Services.AddSingleton(ChannelQueueFormatterFactory);
|
||||
Services.Configure<MassTransitOptions>(x => x.PrefetchCount ??= PrefetchCount);
|
||||
Services.Configure<MassTransitWorkflowDispatcherOptions>(x => { });
|
||||
Services.AddActivityProvider<MassTransitActivityTypeProvider>();
|
||||
_runInMemory = BusConfigurator is null;
|
||||
|
|
|
|||
17
src/modules/Elsa.MassTransit/Options/MassTransitOptions.cs
Normal file
17
src/modules/Elsa.MassTransit/Options/MassTransitOptions.cs
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
namespace Elsa.MassTransit.Options;
|
||||
|
||||
/// <summary>
|
||||
/// Represents the options for configuring MassTransit.
|
||||
/// </summary>
|
||||
public class MassTransitOptions
|
||||
{
|
||||
/// The TTL of queues that are seen as temporary (typically queues that are created per running instance).
|
||||
public TimeSpan? TemporaryQueueTtl { get; set; }
|
||||
/// The number of concurrent messages to process.
|
||||
public int? ConcurrentMessageLimit { get; set; }
|
||||
/// The number of messages to fetch from the bus with each request.
|
||||
public int? PrefetchCount { get; set; }
|
||||
/// The maximum duration for auto-renewal of a resource.
|
||||
/// <remarks>Only relevant when using Azure Service Bus.</remarks>
|
||||
public TimeSpan? MaxAutoRenewDuration { get; set; }
|
||||
}
|
||||
|
|
@ -5,8 +5,6 @@ namespace Elsa.MassTransit.Options;
|
|||
/// Provides options to the <see cref="DispatchWorkflowRequestConsumerDefinition"/>
|
||||
public class MassTransitWorkflowDispatcherOptions
|
||||
{
|
||||
/// The TTL of queues that are seen as temporary (typically queues that are created per running instance).
|
||||
public TimeSpan? TemporaryQueueTtl { get; set; }
|
||||
/// The number of concurrent messages to process.
|
||||
public int? ConcurrentMessageLimit { get; set; }
|
||||
}
|
||||
Loading…
Reference in a new issue