c# - 队列消息未移至有害队列

标签 c# azure azure-webjobs azure-webjobssdk azure-storage-queues

我有一份将文件导入系统的工作。每次导入文件时,我们都会在 azure 中创建一个 blob,并向队列发送一 strip 有指令的消息,以便数据相应地保存在 SQL 中。我们使用 azure-webjobsazure-webjobssdk 来完成此操作。

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

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();
    }
}

函数.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 后,我看到正在处理消息(我认为出队计数超过 7 的消息应该已移至有害队列)。 关于为什么会发生这种情况以及可以采取哪些措施来实现所需行为的任​​何想法。

谢谢

更新 薇薇安的以下解决方案有效。
马修很友善地做了一个公关来解决这个问题。您可以查看PR here.

Queue-Dequeue Counts over 50 Poison-Queue

最佳答案

弗雷德,

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

更新它以返回任务:

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 将再次处理它,依此类推。

关于c# - 队列消息未移至有害队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41876364/

相关文章:

C#/ lambda : What does param in the following refer to?

Azure Cosmos DB : 503 Service Unavailable

python - Azure Function + Rider Credential 问题导致 "Message: AKV10032"错误

c# - AzureWebJobs仪表板配置错误

azure - 重新部署 Azure WebJob

c# - Unity3d 中的多线程脚本调用

c# - 以编程方式创建资源文件

c# - 使用 sql 连接的最佳/标准方法是什么?

caching - azure redis 缓存/ session 是否需要可序列化属性

Azure Web 作业影响应用服务计划性能的悠久历史