in src/WebJobs.Extensions.DurableTask/AzureStorageDurabilityProviderFactory.cs [31:98]
public AzureStorageDurabilityProviderFactory(
IOptions<DurableTaskOptions> options,
IStorageServiceClientProviderFactory clientProviderFactory,
INameResolver nameResolver,
ILoggerFactory loggerFactory,
#pragma warning disable CS0612 // Type or member is obsolete
IPlatformInformation platformInfo)
#pragma warning restore CS0612 // Type or member is obsolete
{
// this constructor may be called by dependency injection even if the AzureStorage provider is not selected
// in that case, return immediately, since this provider is not actually used, but can still throw validation errors
if (options.Value.StorageProvider.TryGetValue("type", out object value)
&& value is string s
&& !string.Equals(s, this.Name, StringComparison.OrdinalIgnoreCase))
{
return;
}
this.options = options.Value;
this.clientProviderFactory = clientProviderFactory ?? throw new ArgumentNullException(nameof(clientProviderFactory));
this.nameResolver = nameResolver ?? throw new ArgumentNullException(nameof(nameResolver));
this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
this.azureStorageOptions = new AzureStorageOptions();
this.inConsumption = platformInfo.IsInConsumptionPlan();
// The consumption plan has different performance characteristics so we provide
// different defaults for key configuration values.
int maxConcurrentOrchestratorsDefault = this.inConsumption ? 5 : 10 * Environment.ProcessorCount;
int maxConcurrentActivitiesDefault = this.inConsumption ? 10 : 10 * Environment.ProcessorCount;
int maxConcurrentEntitiesDefault = this.inConsumption ? 10 : 10 * Environment.ProcessorCount;
int maxEntityOperationBatchSizeDefault = this.inConsumption ? 50 : 5000;
if (this.inConsumption)
{
WorkerRuntimeType language = platformInfo.GetWorkerRuntimeType();
if (language == WorkerRuntimeType.Python)
{
this.azureStorageOptions.ControlQueueBufferThreshold = 32;
}
else
{
this.azureStorageOptions.ControlQueueBufferThreshold = 128;
}
}
WorkerRuntimeType runtimeType = platformInfo.GetWorkerRuntimeType();
if (runtimeType == WorkerRuntimeType.DotNetIsolated ||
runtimeType == WorkerRuntimeType.Java ||
runtimeType == WorkerRuntimeType.Custom)
{
this.useSeparateQueueForEntityWorkItems = true;
}
// The following defaults are only applied if the customer did not explicitely set them on `host.json`
this.options.MaxConcurrentOrchestratorFunctions = this.options.MaxConcurrentOrchestratorFunctions ?? maxConcurrentOrchestratorsDefault;
this.options.MaxConcurrentActivityFunctions = this.options.MaxConcurrentActivityFunctions ?? maxConcurrentActivitiesDefault;
this.options.MaxConcurrentEntityFunctions = this.options.MaxConcurrentEntityFunctions ?? maxConcurrentEntitiesDefault;
this.options.MaxEntityOperationBatchSize = this.options.MaxEntityOperationBatchSize ?? maxEntityOperationBatchSizeDefault;
// Override the configuration defaults with user-provided values in host.json, if any.
JsonConvert.PopulateObject(JsonConvert.SerializeObject(this.options.StorageProvider), this.azureStorageOptions);
var logger = loggerFactory.CreateLogger(nameof(this.azureStorageOptions));
this.azureStorageOptions.Validate(logger);
this.DefaultConnectionName = this.azureStorageOptions.ConnectionName ?? ConnectionStringNames.Storage;
}