首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Azure存储队列-正在处理有毒队列上的消息

Azure存储队列-正在处理有毒队列上的消息
EN

Stack Overflow用户
提问于 2017-10-23 20:45:20
回答 6查看 11.4K关注 0票数 4

我也一直使用Azure存储队列来发布消息,然后将消息写入db表。但是,我注意到,当在队列上处理消息时出现错误,消息就会被写入有毒队列。

下面是我的应用程序设置的一些背景知识:

Azure Web App ->将消息写入队列

Azure函数->队列触发器处理消息并将内容写入数据库

db架构存在问题,导致插入失败。每条消息被重试5次,我相信这是重试队列消息的默认设置,在第5次重试之后,消息被放入有毒队列。

db模式随后得到了修复,但现在我无法处理有毒队列上的消息。

我的问题是,我们是否可以恢复写入有毒队列的消息,以便处理它们并将它们插入到数据库中,如果是这样的话,如何恢复它们?

EN

回答 6

Stack Overflow用户

发布于 2017-10-23 21:43:33

对于你的特殊问题,我会推荐这篇文章的问题部分提到的解决方案:Azure: How to move messages from poison queue to back to main queue?

请注意有毒队列== $"{queueName}-poison"的名称

票数 4
EN

Stack Overflow用户

发布于 2018-10-19 20:25:31

在我当前的项目中,我在FunctionApp中创建了所谓的“支持函数”。它公开一个特殊的HTTP端点,该端点具有管理员授权级别,可以在任何时候执行。

请参考下面的代码,它解决了重新处理来自有毒队列的消息的问题:

代码语言:javascript
运行
复制
public static class QueueOperations
{
    [FunctionName("Support_ReprocessPoisonQueueMessages")]
    public static async Task<IActionResult> Support_ReprocessPoisonQueueMessages([HttpTrigger(AuthorizationLevel.Admin, "put", Route = "support/reprocessQueueMessages/{queueName}")]HttpRequest req, ILogger log,
        [Queue("{queueName}")] CloudQueue queue,
        [Queue("{queueName}-poison")] CloudQueue poisonQueue, string queueName)
    {
        log.LogInformation("Support_ReprocessPoisonQueueMessages function processed a request.");

        int.TryParse(req.Query["messageCount"], out var messageCountParameter);
        var messageCount = messageCountParameter == 0 ? 10 : messageCountParameter;

        var processedMessages = 0;
        while (processedMessages < messageCount)
        {
            var message = await poisonQueue.GetMessageAsync();
            if (message == null)
                break;

            var messageId = message.Id;
            var popReceipt = message.PopReceipt;

            await queue.AddMessageAsync(message); // a new Id and PopReceipt is assigned
            await poisonQueue.DeleteMessageAsync(messageId, popReceipt);
            processedMessages++;
        }

        return new OkObjectResult($"Reprocessed {processedMessages} messages from the {poisonQueue.Name} queue.");
    }
}

或者,使用附加元数据创建一个新消息可能是一个好主意(作为消息在过去已经被处理但没有成功的信息-然后它可以被发送到死信队列)。

票数 1
EN

Stack Overflow用户

发布于 2017-10-23 21:50:36

您有两个选择

  1. 添加了另一个函数,该函数由添加到有毒队列的消息触发。您可以尝试在此函数中将内容添加到数据库中。有关此方法的更多详细信息,请访问here。当然,如果此函数也无法处理消息,您可以检查出队计数,并向处理队列的函数发送一个需要手动intervention.
  2. Add一个int 'dequeueCount‘参数的通知,然后在5次重试后记录失败,而不是让消息进入有毒队列。例如,您可以发送电子邮件通知需要手动干预。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46889743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档