我当前正在使用 WebJobs SDK 来使用队列中发出的消息。

我的方法作为带有 [Microsoft.Azure.WebJobs.QueueTrigger(...)] 属性的一个参数,并且可以正常触发。 在某些情况下,该方法可以处理消息,但有时,我希望它拒绝该消息,直到关键资源可用。

在这种情况下,我尝试抛出异常,但与引用文献所述相反,队列触发器立即再次触发(显然没有等待租用时间)。

有没有办法优雅地推迟消息处理? 仅卡住等待关键资源的线程是否安全?

任何提示将不胜感激。

请您参考如下方法:

我认为在当前版本中您无法推迟消息。

可能的解决方法

您可以延迟重新添加相同的消息,为了避免重复,您可以将 MaxDequeueCount 设置为 1,这将发送失败异常后消息直接发送到poison队列:

        JobHostConfiguration configuration = new JobHostConfiguration(); 
        configuration.Queues.MaxDequeueCount = 1; 

和消息处理器 - 延迟重新添加消息并抛出异常:

    public static void ProcessMessage([QueueTrigger("resource-heavy-queue")] string message, [Queue("resource-heavy-queue")]  CloudQueue originalQueue) 
    { 
        if ( /*Resource unavaliable*/) 
        { 
            var messageToReAdd = new CloudQueueMessage(message); 
            originalQueue.AddMessage(messageToReAdd, null, TimeSpan.FromSeconds(10)); 
            throw new ResourcesNotAvailableException(); 
        } 
    } 

通过这种方式,您可以为您的资源实现某种退避策略。不幸的是,您必须手动处理一些问题:

  • 处理有害消息 - 如果您不断重新添加相同的消息,则可能会陷入无限循环,因此您必须扩展消息模型以携带 NumberOfRetries 并在每次重新添加时递增它添加它
  • 每次重新添加后,消息 IdInsertionTime 都会有所不同,因此您不能依赖它们。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!