【问题标题】:Azure function CosmosDbTrigger (Start from the beginning option)Azure 函数 CosmosDbTrigger(从头开始选项)
【发布时间】:2017-12-19 13:51:17
【问题描述】:

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

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

        ...
    }

【问题讨论】:

    标签: azure azure-cosmosdb azure-functions


    【解决方案1】:

    目前,StartFromBeginning 选项未暴露给 Cosmos DB 触发器。默认行为是从函数开始运行的那一刻开始接收更改,如果主机/运行时关闭,将生成租约/检查点,因此当主机/运行时备份时,它将从最后一个检查点项目中获取。

    触发器不会实现死信或错误处理,因为如果错误与批次本身无关(例如,您处理文档和然后发送电子邮件并且电子邮件失败,整个批次将针对与提要本身无关的错误进行重新处理),因此我们建议用户在函数代码中实现自己的 try/catch 或错误处理逻辑。这与事件中心触发器的方法相同。

    话虽如此,我们正在公开几个new options on the Trigger,并且有一个贡献者正在处理an advanced retrying mechanism

    【讨论】:

    • 在我的例子中,我使用 CosmosTriggerFunction 来同步 Cosmos 和 Redis 缓存,当我们必须清除和重建 Redis 缓存时,我已经编写了 WebJob。有没有更好的推荐?
    • 这个答案是旧的,StartFromBeginning 在这一点上存在,你可以使用它。见docs.microsoft.com/en-us/azure/azure-functions/…
    • 是的,它仅在 V2 中可用。
    【解决方案2】:

    正如@Matias Quaranta 和@Pankaj Rawat 在 cmets 中所说,接受的答案已经过时并且不再正确。您可以在 azure 函数的参数列表中使用 StartFromTheBeginning 作为 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】:

      当前偏移量(Cosmos DB 更改源中的位置)由客户端管理,在本例中为 Azure Functions 运行时。

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

      要从特定项目重新开始,您必须在某个时间点为租约集合中的文档创建快照,然后在需要时将当前集合恢复到该快照。

      除了处理 Cosmos DB 集合的通用工具之外,我不熟悉可以为您自动执行此操作的工具。

      【讨论】:

      • 首先感谢您的评论。不抱歉。首先,我删除了租约中的文件。然后更改了租约名称。两者都没有工作。
      • 删除租约不会使函数从头开始。如果没有租约,Function 从它开始运行的那一刻(现在)开始接收更改。
      【解决方案4】:

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

      设置后,它告诉触发器从集合历史的开头而不是当前时间开始读取更改。这仅在触发器第一次启动时有效,因为在后续运行中,检查点已被存储。当已创建租约时将此设置为 true 无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-08
        相关资源
        最近更新 更多