Автоматическое повторение привязки к выходу CosmosDb - PullRequest
0 голосов
/ 05 июня 2018

Я использую функцию Azure, которая отправляет массив из приблизительно 200 документов в CosmosDB через привязку вывода.Эта функция запускается около 1000 одновременно сообщениями очереди.

В некоторых случаях я получаю сообщение об ошибке «Частота запросов велика», и выполнение функции завершается неудачно.Документация говорит, что когда возникает эта ошибка, я могу повторить попытку через несколько миллисекунд, но я подозреваю, что выполнение Azure делает это для меня.Я не смог найти никакой документации, в которой явно сказано, что когда выходная привязка генерирует это исключение, она автоматически повторяется (как в случае библиотеки .NET Linq).

Может кто-нибудь указать мне, чтобы узнать, так ли это?

1 Ответ

0 голосов
/ 05 июня 2018

Привязка вывода использует SDK 1.13.2, в котором уже есть механизм повтора.

Предполагается, что вы используете функции Azure v1, если вы используете IAsyncCollection , которую будет выполнять функцияUpsertDocumentAsync для каждого AddAsync, если вы используете один выходной документ, тогда UpsertDocumentAsync должно происходить один раз.

В любом случае SDK по умолчанию повторяется 9 раз на удушенный результат, после этого, исключение всплывает, и ваша функция выдаст ошибку;документ должен возвращаться в очередь для повторения в соответствии с дизайном QueueTrigger, и после нескольких итераций он переходит в очередь deadletter.

Если вы хотите более детальный контроль потока, вы можетеполучите DocumentClient и выполните 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}.");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...