我有一个由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.");
}
}
}
答案 0 :(得分:0)
触发器不会重试文档批处理,您可能会收到相同文档的更新。
如果您查看thisDocument.GetPropertyValue<int>("_ts")
(它是操作的时间戳记),则会看到这些值是不同的。
变更Feed包含插入和更新操作,如果您的体系结构多次更新同一文档,那么预期变更Feed中将有多个条目针对同一文档ID。
另外,与之无关的是,您在每次执行时都创建一个CloudStorageAccount
的实例,一个好的模式是维护一个实例并通过依赖注入或使用Lazy初始化共享它(参见https://docs.microsoft.com/azure/azure-functions/manage-connections)。