我正在使用Azure功能,通过输出绑定将大约200个文档的数组发送到CosmosDB。该功能通过队列消息同时触发大约1000个。
在某些情况下,我收到“请求率很大”错误,并且函数执行失败。 documentation表示发生此错误时,我可以在几毫秒内重试执行,但我怀疑azure函数运行时是为我做的。我找不到任何文档明确说明当输出绑定抛出该异常时它会自动重试(就像使用.NET Linq库一样)。
有人可以指出我是否是这种情况吗?
答案 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}.");
}
}