自动重试CosmosDb输出绑定

时间:2018-06-05 08:48:35

标签: azure azure-functions azure-cosmosdb

我正在使用Azure功能,通过输出绑定将大约200个文档的数组发送到CosmosDB。该功能通过队列消息同时触发大约1000个。

在某些情况下,我收到“请求率很大”错误,并且函数执行失败。 documentation表示发生此错误时,我可以在几毫秒内重试执行,但我怀疑azure函数运行时是为我做的。我找不到任何文档明确说明当输出绑定抛出该异常时它会自动重试(就像使用.NET Linq库一样)。

有人可以指出我是否是这种情况吗?

1 个答案:

答案 0 :(得分:2)

输出绑定使用已经具有重试机制的SDK 1.13.2。

假设您正在使用Azure Functions v1,如果您使用IAsyncCollection,则函数将为每个UpsertDocumentAsync执行AddAsync,如果您使用单个文档输出,则UpsertDocumentAsync应该发生一次。

在任何情况下,SDK都会在受限制的结果上重试9 times,之后会出现异常,并且您的函数会出错;文档应该按照QueueTrigger设计返回队列进行重试,经过几次迭代后,它将进入deadletter队列..

如果您想要更精细地控制流量,可以获得DocumentClient并使用try / catch自己执行UpsertDocumentAsync,如果失败超过9次,您可以选择发送到另一个队列或重试另一组。类似的东西:

using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;

[FunctionName("CosmosDBSample")]
public static async Task<HttpResponseMessage> Run(
    [QueueTrigger("my-queue")] MyPOCOClass myMessage, 
    [DocumentDB("test", "test", ConnectionStringSetting = "CosmosDB"] DocumentClient client, 
    TraceWriter log)
{
    try
    {
        await client.UpsertDocumentAsync(myMessage);
    }
    catch(DocumentClientException ex)
    {
        // retry / queue somewhere else?
        log.Warning($"DocumentClientException {ex.Message} in document {myMessage.Id}.");
    }
}