Exemplo n.º 1
0
        public async Task ScaleDownIncrementally()
        {
            IList <CosmosDbScalingCollectionSettings> settingsToUpdate = new List <CosmosDbScalingCollectionSettings>();

            IEnumerable <CosmosDbScalingCollectionSettings> collectionsToProcess = await _scalingConfigRepositoryPolicy.ExecuteAsync(() =>
                                                                                                                                     _cosmosDbScalingConfigRepository.GetCollectionSettingsIncremented(previousMinutestoCheckForScaledCollections));

            if (collectionsToProcess.IsNullOrEmpty())
            {
                return;
            }

            _logger.Information($"Found {collectionsToProcess.Count()} collections to scale down");

            foreach (CosmosDbScalingCollectionSettings settings in collectionsToProcess)
            {
                try
                {
                    int requestUnitsToDecrement;

                    if ((settings.CurrentRequestUnits - settings.LastScalingIncrementValue) < settings.MinRequestUnits)
                    {
                        requestUnitsToDecrement = (settings.CurrentRequestUnits - settings.MinRequestUnits);

                        if (requestUnitsToDecrement <= 0)
                        {
                            continue;
                        }
                    }
                    else
                    {
                        requestUnitsToDecrement = settings.LastScalingIncrementValue;
                    }

                    int requestUnits = settings.CurrentRequestUnits - requestUnitsToDecrement;

                    settings.CurrentRequestUnits = requestUnits;

                    await ScaleCollection(settings.CosmosCollectionType, requestUnits);

                    await UpdateCollectionSettings(settings, CosmosDbScalingDirection.Down, requestUnitsToDecrement);
                }
                catch (Exception ex)
                {
                    throw new RetriableException($"Failed to scale down collection for repository type '{settings.CosmosCollectionType}'", ex);
                }
            }
        }
Exemplo n.º 2
0
        public async Task ScaleDownIncrementally()
        {
            IEnumerable <CosmosDbScalingCollectionSettings> collectionsToProcess = await _scalingConfigRepositoryPolicy.ExecuteAsync(() =>
                                                                                                                                     _cosmosDbScalingConfigRepository.GetCollectionSettingsIncremented(previousMinutestoCheckForScaledCollections));


            if (collectionsToProcess.IsNullOrEmpty())
            {
                return;
            }

            _logger.Information($"Found {collectionsToProcess.Count()} collections to scale down");

            foreach (CosmosDbScalingCollectionSettings settings in collectionsToProcess)
            {
                try
                {
                    int previousCurrentRequestUnits = settings.CurrentRequestUnits;

                    settings.CurrentRequestUnits = Math.Max(previousCurrentRequestUnits - settings.LastScalingIncrementValue, settings.MinRequestUnits);

                    int?minimumRequestUnitsAllowed = await GetMinimumThroughput(settings.CosmosCollectionType);

                    if (minimumRequestUnitsAllowed.HasValue && settings.CurrentRequestUnits < minimumRequestUnitsAllowed.Value)
                    {
                        settings.CurrentRequestUnits = minimumRequestUnitsAllowed.Value;
                    }

                    int requestUnitsToDecrement = previousCurrentRequestUnits - settings.CurrentRequestUnits;

                    if (requestUnitsToDecrement <= 0)
                    {
                        continue;
                    }

                    settings.CurrentRequestUnits = await ScaleCollection(settings.CosmosCollectionType, settings.CurrentRequestUnits, settings.MaxRequestUnits);

                    await UpdateCollectionSettings(settings, CosmosDbScalingDirection.Down, requestUnitsToDecrement);
                }
                catch (Exception ex)
                {
                    throw new RetriableException($"Failed to scale down collection for repository type '{settings.CosmosCollectionType}'", ex);
                }
            }
        }