Azure 函数队列触发器:如何设置出列消息的时间延迟

Posted

技术标签:

【中文标题】Azure 函数队列触发器:如何设置出列消息的时间延迟【英文标题】:Azure Function Queue trigger: how to set time delay for dequeue message 【发布时间】:2019-06-20 19:34:18 【问题描述】:

我有一个 Azure 函数,它监听 azure 队列,例如,有问题。它再次将消息重新添加到队列中。但是经过 5 次消息会被移动到毒队列。

我想延迟将消息重新添加到队列中。例如,重试 1 小时。因为我的 Azure Function 使用外部资源,目前可能不可用。我根本不想在 10 秒内重试 5 次,我想在 1 小时后重试。当然,我自己编写了它的实现,但可能这个特性已经存在了。

【问题讨论】:

这些可能有帮助:***.com/questions/50817971/…***.com/questions/39648697/…,也发现了这个:docs.microsoft.com/en-us/azure/azure-functions/…。查看 host.json 的 visibilityTimeout 属性 【参考方案1】:

@4c74356b41 指出了正确的方法。队列的host.json 设置就是您要查找的内容。

visibilityTimeout 是消息处理失败时重试之间的时间间隔 maxDequeueCount 是在将消息移动到毒队列之前尝试处理消息的次数。


    "version": "2.0",
    "extensions": 
        "queues": 
            "visibilityTimeout" : "01:00:00",
            "maxDequeueCount": 2
        
    

如果你的函数是 v1,类似


    "queues": 
      "visibilityTimeout" : "01:00:00",
      "maxDequeueCount": 2
    

更新

由于问题主要是根据具体情况更改visibilityTimeout,因此设置CloudQueue.AddMessageAsync的延迟是唯一的方法。实际上 visibilityTimeout 做的事情完全一样,只是在函数应用级别(所有队列),所以在这种情况下我们不需要坚持。

【讨论】:

但它为所有查询设置了一个值,我想为每个案例设置不同的值 @OlegSh 您的意思是在每种情况下,出队的延迟都不同?如果是这样我们可能不得不依赖你自己的实现代码,配置是整个函数应用级别的,无法动态更改。 是的,我在每种情况下都需要不同的延迟(即在内部服务器不可用的地方,我想在 1 小时内重试,但在本地数据库未更新时,在 5 小时内分钟) @OlegSh 嗯...我认为根据情况设置CloudQueue.AddMessageAsync的延迟是唯一的方法。实际上 visibilityTimeout 做的事情完全一样,只是在函数应用级别(所有队列),所以在这种情况下我们不需要坚持。

以上是关于Azure 函数队列触发器:如何设置出列消息的时间延迟的主要内容,如果未能解决你的问题,请参考以下文章

Azure 存储队列触发的 Azure 函数

Azure 服务总线队列消息处理

Azure 队列触发器不适用于 Java

更新到 Microsoft.Net.Functions 3.0.3 后如何正确设置 Azure 队列触发器?

使用多个 Azure 队列触发单个 Azure 函数

天蓝色存储队列中的最大出队数