Azure函数CosmosDbTrigger(从开头选项开始)

时间:2017-12-19 13:51:18

标签: azure azure-cosmosdb azure-functions

我有一个带cosmos db触发器的azure函数,它可以进行一些计算并将结果写入db。如果出现问题,我希望从第一个项目或特定项目开始再次进行计算。可能吗?感谢

public static void Run([CosmosDBTrigger(
        databaseName: "db",
        collectionName: "collection",
        ConnectionStringSetting = "DocDbConnStr",
        CreateLeaseCollectionIfNotExists = true,
        LeaseCollectionName = "leases")]IReadOnlyList<Document> input, TraceWriter log)
    {

        ...
    }

4 个答案:

答案 0 :(得分:3)

目前,directory = "../Detections/NAC20171125" frames = [os.path.join(directory, str(f)) for f in range(10)] # Start with a dataset of directory names. dataset = tf.data.Dataset.from_tensor_slices(frames) # Maps each subdirectory to the list of files in that subdirectory and flattens # the result. dataset = dataset.flat_map(lambda dir: tf.data.Dataset.list_files(dir + "/*")) # Maps each filename to the parsed and resized image data. dataset = dataset.map(parse_file) dataset = dataset.batch(256) iterator = dataset.make_initializable_iterator() next_element = iterator.get_next() 选项未向Cosmos DB Trigger公开。默认行为是从函数开始运行时开始接收更改,如果主机/运行时关闭,将生成租约/检查点,因此当主机/运行时备份时,它将从最后一个检查点项目中获取。

触发器不会实现死字或错误处理,因为如果错误与批处理本身无关(例如,您处理文档和文件),它可能会生成同一批次的无限循环/意外计费/多次处理然后发送电子邮件并且电子邮件失败,整个批处理将被重新处理以发现与Feed本身无关的错误,因此我们建议用户在Function的代码中实现自己的try / catch或错误处理逻辑。它与事件中心触发器的方法相同。

话虽如此,我们正在揭露多个new options on the Trigger,并且有一位撰稿人致力于an advanced retrying mechanism

答案 1 :(得分:1)

当前偏移量(Cosmos DB更改Feed中的位置)由客户端管理,在这种情况下为Azure Functions运行时。

函数将偏移量存储在租约集合中(在您的示例中称为leases)。

要从特定项目重新启动,您必须在某个时刻在租约集合中创建文档的快照,然后在需要时将当前集合还原到该快照。

除了使用Cosmos DB集合的通用工具之外,我不熟悉为您自动化的工具。

答案 2 :(得分:1)

正如@Matias Quaranta和@Pankaj Rawat在评论中所说,接受的答案是旧的,不再是真实的。您可以将StartFromTheBeginning用作azure函数的参数列表中的C#属性,如下所示:

[FunctionName(nameof(MyAzureFunction))]
public async Task RunAsync([CosmosDBTrigger(
    databaseName: "myCosmosDbName",
    collectionName: "myCollectionName",
    ConnectionStringSetting = "cosmosConnectionString",
    LeaseCollectionName = "leases",
    CreateLeaseCollectionIfNotExists = true,
    MaxItemsPerInvocation = 1000,
    StartFromBeginning = true)]IReadOnlyList<Document> documents)
{
    ....
}

请更改接受的答案。

答案 3 :(得分:0)

Check startFromBeginning选项在功能v2中可用。不幸的是,我仍在使用V1,无法验证。

  

设置后,它告诉触发器从集合历史的开始而不是当前时间开始读取更改。这仅在触发器首次启动时才起作用,因为在随后的运行中,检查点已经存储。当已创建租约时将其设置为true无效。