gpt4 book ai didi

multithreading - 优雅地推迟 QueueTrigger

转载 作者:行者123 更新时间:2023-12-02 03:30:27 25 4
gpt4 key购买 nike

我当前正在使用 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 都会有所不同,因此您不能依赖它们。

关于multithreading - 优雅地推迟 QueueTrigger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27132894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com