首页 文章

队列消息未被移动到毒物队列

提问于
浏览
1

我有一个将文件导入系统的工作 . 每次导入文件时,我们都会在azure中创建一个blob,然后向队列发送带有指令的消息,以便数据在SQL中相应地保留 . 我们使用 azure-webjobsazure-webjobssdk 执行此操作 .

我们遇到了一个问题,即在消息失败超过7次后,它们没有按预期移动到poision队列 . 代码如下:

Program.cs

public class Program
{
    static void Main()
    {
        //Set up DI
        var module = new CustomModule();
        var kernel = new StandardKernel(module);

        //Configure JobHost
        var storageConnectionString = AppSettingsHelper.Get("StorageConnectionString");
        var config = new JobHostConfiguration(storageConnectionString) { JobActivator = new JobActivator(kernel), NameResolver = new QueueNameResolver() };
        config.Queues.MaxDequeueCount = 7;
        config.UseTimers();

        //Pass configuration to JobJost
        var host = new JobHost(config);
        host.RunAndBlock();
    }
}

Functions.cs

public class Functions
{
    private readonly IMessageProcessor _fileImportQueueProcessor;

    public Functions(IMessageProcessor fileImportQueueProcessor)
    {
        _fileImportQueueProcessor = fileImportQueueProcessor;
    }

    public async void FileImportQueue([QueueTrigger("%fileImportQueueKey%")] string item)
    {
        await _fileImportQueueProcessor.ProcessAsync(item);
    }

}

_fileImportQueueProcessor.ProcessAsync(item) 抛出异常并正确地增加并重新处理了消息的出列计数 . 但是,它从未被移动到毒药队列中 . 我附上了队列的屏幕截图,其中出列计数超过50 .

多次失败后,webjob陷入Pending Restart状态,我无法停止或启动,我最终完全删除它 . 在本地运行webjob之后,我看到了正在处理的消息(我假设出队计数超过7的那个应该被移动到毒性队列中) . 关于为什么会发生这种情况以及可以采取哪些措施来获得理想行为的任何想法 .

谢谢,

Update 下面的Vivien解决方案有效 .
马修很友好地做了一个可以解决这个问题的公关 . 你可以查看PR here.

Queue-Dequeue Counts over 50

Poison-Queue

1 回答

  • 4

    弗雷德,

    作为 async void 的FileImportQueue方法是您的问题的根源 .

    更新它以返回 Task

    public class Functions
    {
        private readonly IMessageProcessor _fileImportQueueProcessor;
    
        public Functions(IMessageProcessor fileImportQueueProcessor)
        {
            _fileImportQueueProcessor = fileImportQueueProcessor;
        }
    
        public async Task FileImportQueue([QueueTrigger("%fileImportQueueKey%")] string item)
        {
            await _fileImportQueueProcessor.ProcessAsync(item);
        }
    }
    

    出队计数超过50的原因是因为当_fileImportQueueProcessor.ProcessAsync(item)抛出异常时,它将使整个进程崩溃 . 这意味着WebJobs SDK无法执行将消息移动到毒性队列的下一个任务 .

    当消息在队列中再次可用时,SDK将再次处理它,依此类推 .

相关问题