Сообщения очереди хранилища Azure перемещаются все сразу в опасную очередь по прошествии определенного периода времени.

Действия по воспроизведению

Добавляйте сообщения в очередь (около 500 сообщений). Добавьте приложение-функцию, запускаемую очередью, которое будет обрабатывать сообщения очереди.

Ожидаемое поведение

Все сообщения из очереди обрабатываются. Если во время обработки сообщения возникает исключение, оно отправляется в очередь подозрений.

Фактическое поведение

Сообщения начинают обрабатываться. Через некоторое время (где-то около 30-60 секунд) все сообщения, оставшиеся в очереди, перемещаются в очередь подозрений. Никаких исключений для сообщений, которые обрабатываются в этот момент, не возникает.

Мы проверили, что время жизни сообщения в очереди задано по умолчанию: 7 дней. Мы попытались понизить версию пакета WindowsAzure.Storage до 7.2.1, но безуспешно.

Версия WindowsAzure.Storage, которую мы используем, - 8.5.0.

Возможно ли, что приложение-функция выйдет из строя, и это приведет к перемещению всех сообщений в очередь подозрений?

ИЗМЕНИТЬ

Вот как сообщения добавляются в очередь:

public async Task AddMessage()
{
    var queueModel = new QueueModel
    {
        // queue model properties
    };

    await AddMessageToQueueAsync(queueModel);
}


public async Task AddMessageToQueueAsync(T messageObject, TimeSpan? initialVisibilityDelay = null)
{
    var queue = GetQueue();
    var jsonMessage = JsonConvert.SerializeObject(messageObject);
    var message = new CloudQueueMessage(jsonMessage);

    await queue.AddMessageAsync(message, TimeSpan.FromDays(7), initialVisibilityDelay, new QueueRequestOptions(), new OperationContext());
}

private CloudQueue GetQueue()
{
    var queueClient = _storageAccount.CreateCloudQueueClient();

    var queue = queueClient.GetQueueReference(_queueName);
    queue.CreateIfNotExists();

    return queue;
}

И это приложение-функция, которое обрабатывает сообщения:

[FunctionName("ProcessQueue")]
public static async Task Run([QueueTrigger("queue-name", Connection = "AzureWebJobsStorage")]string queueItem, TraceWriter log)
{
    if (String.IsNullOrEmpty(queueItem))
    {
        return;
    }

    var queueModel = JsonConvert.DeserializeObject<QueueModel>(queueItem);
    if (queueModel == null)
    {
        return;
    }

    try
    {
        // process the message
    }
    catch (Exception ex)
    {
        // message is moved to the poison-queue but no exception is thrown
        log.Error(ex.Message, ex);
    }
}

person GicaGG    schedule 02.11.2017    source источник
comment
Можете ли вы сказать, сколько раз выполняется функция? Запускается ~ 500 раз?   -  person Cloud SME    schedule 02.11.2017
comment
Предполагается, что он будет запускаться ~ 500 раз, но он выполняется только около 300 раз, пока остальные сообщения не будут перемещены в очередь подозрительных сообщений.   -  person GicaGG    schedule 02.11.2017
comment
Пожалуйста, добавьте код для вашего репро   -  person Mikhail Shilkov    schedule 02.11.2017
comment
Если сообщение из очереди не было успешно обработано до 5 раз, то сообщение будет перемещено в подозрительную очередь. Любое другое необработанное исключение также приведет к тому же результату на основе моего тестирования.   -  person Baskar Rao    schedule 02.11.2017


Ответы (1)


Нашел проблему. Проблема заключалась в оставшемся приложении-функции, которое прослушивало ту же очередь и обрабатывало сообщения параллельно с текущим приложением-функцией. Поскольку оба приложения-функции обрабатывали сообщения из одной очереди, в какой-то момент все сообщения, оставшиеся в очереди, были перемещены в подозрительную очередь. (Возможно, проблема заключалась в некоторых проблемах с параллелизмом при чтении сообщений из очереди).

person GicaGG    schedule 03.11.2017