一段时间后,Azure存储队列消息将一次性移动到毒性队列

时间:2017-11-02 16:34:47

标签: c# azure azure-functions azure-queues

重新执行

向队列添加消息(大约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);
    }
}

1 个答案:

答案 0 :(得分:0)

发现了这个问题。问题是一个剩余的功能应用程序,它侦听同一个队列并与当前的功能应用程序并行处理消息。因为两个功能应用程序都处理来自同一队列的消息,所以在某些时候,队列中剩余的消息都被移动到了毒药队列。 (从队列中读取消息时可能存在一些并发问题)。