Azure Function CosmosDb触发器反复处理相同的文档

时间:2019-06-12 22:43:05

标签: azure azure-functions azure-cosmosdb azure-triggers

我有一个由CosmosDb插入/更新触发的功能,并且我将每个文档复制到存储Blob。调试时,该函数针对相同的少数文档反复触发。

我尝试限制已处理文档的数量,但这使得它只能一遍又一遍地处理相同的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 :(得分:0)

触发器不会重试文档批处理,您可能会收到相同文档的更新。

如果您查看thisDocument.GetPropertyValue<int>("_ts")(它是操作的时间戳记),则会看到这些值是不同的。

变更Feed包含插入和更新操作,如果您的体系结构多次更新同一文档,那么预期变更Feed中将有多个条目针对同一文档ID。

另外,与之无关的是,您在每次执行时都创建一个CloudStorageAccount的实例,一个好的模式是维护一个实例并通过依赖注入或使用Lazy初始化共享它(参见https://docs.microsoft.com/azure/azure-functions/manage-connections)。