Функция Azure CosmosDb Trigger обрабатывает одни и те же документы снова и снова - PullRequest
0 голосов
/ 13 июня 2019

У меня есть функция, которая запускается при вставке / обновлении CosmosDb, и я копирую каждый документ в большой двоичный объект. При отладке функция запускается снова и снова для одной и той же горстки документов.

Я пытался ограничить количество обрабатываемых документов, но это заставляет его обрабатывать только одни и те же N документов снова и снова. Я пытался поднять RU для коллекции триггеров (и коллекции аренды), но это не имело никакого эффекта.

[FunctionName("Function1")]
        public async static Task Run([CosmosDBTrigger(
            databaseName: "Events",
            collectionName: "DomainEvents",
            ConnectionStringSetting = "cosmosConnectionString",
            CreateLeaseCollectionIfNotExists = true,
            LeaseCollectionName = "DomainEventLeases")]IReadOnlyList<Document> input, ILogger log, ExecutionContext context)
        {
            if (input != null && input.Count > 0)
            {
                var config = new ConfigurationBuilder()
                 .SetBasePath(context.FunctionAppDirectory)
                 .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                 .AddEnvironmentVariables()
                 .Build();

                CloudStorageAccount cloudStorageAccount;

                if (CloudStorageAccount.TryParse(config["StorageConnectionAppSetting"], out cloudStorageAccount))
                {
                    var client = cloudStorageAccount.CreateCloudBlobClient();
                    var container = client.GetContainerReference("wormauditlog");

                    foreach(var thisDocument in input)
                    {
                        var blob = container.GetBlockBlobReference(thisDocument.Id);

                        try
                        {
                            await blob.UploadFromByteArrayAsync(thisDocument.ToByteArray(), 0, thisDocument.ToByteArray().Length);
                        }
                        catch(Exception e)
                        {
                            throw;
                        }
                    }
                }
                else
                {
                    throw new FunctionInvocationException("Bad storage connection string.");
                }

            }
        }

1 Ответ

0 голосов
/ 13 июня 2019

Триггер не повторяет пакеты документов, возможно, вы получаете обновления для тех же документов.

Если вы проверите thisDocument.GetPropertyValue<int>("_ts"), который является меткой времени операции, вы увидите, что это разные значения.

Канал изменений содержит операции вставки и обновления, если ваша архитектура обновляет один и тот же документ несколько раз, то ожидается, что в канале изменений будет несколько записей для одного и того же идентификатора документа.

Кроме того, неважно, что было бы хорошо, если вы создаете экземпляр CloudStorageAccount при каждом выполнении, хорошим шаблоном является поддержка одного экземпляра и совместное использование его либо с помощью Dependency Injection, либо с помощью отложенной инициализации (см. https://docs.microsoft.com/azure/azure-functions/manage-connections).

...