Python 您能否对Azure函数或存储队列的输出进行速率限制?

Python 您能否对Azure函数或存储队列的输出进行速率限制?,python,azure,azure-functions,azure-storage-queues,Python,Azure,Azure Functions,Azure Storage Queues,我有一个存储队列触发的Python Azure函数,它将作业提交给第三方速率有限的API(1个请求/分钟)。触发函数的队列将定期接收突发消息,因此我需要一种方法来确保函数在收到第一条消息后立即触发,第二条消息1分钟后触发,第三条消息2分钟后触发,等等,直到队列为空 是否可以对队列或函数进行速率限制,以便我每分钟只运行一次函数,直到队列为空?无法对存储队列进行速率限制(队列自然受到存储事务速率限制的速率限制除外,存储事务速率限制比您当前所需的速率限制大几个数量级) 您可以为Azure函数设置计时器

我有一个存储队列触发的Python Azure函数,它将作业提交给第三方速率有限的API(1个请求/分钟)。触发函数的队列将定期接收突发消息,因此我需要一种方法来确保函数在收到第一条消息后立即触发,第二条消息1分钟后触发,第三条消息2分钟后触发,等等,直到队列为空


是否可以对队列或函数进行速率限制,以便我每分钟只运行一次函数,直到队列为空?

无法对存储队列进行速率限制(队列自然受到存储事务速率限制的速率限制除外,存储事务速率限制比您当前所需的速率限制大几个数量级)

您可以为Azure函数设置计时器触发器,而不是在消息到达队列之外触发Azure函数。这将允许您在计时器上设置(例如)1分钟的间隔,您的函数可以在这里读取消息并调用第三方API

您需要指定一个计时器值,它是一个NContab表达式,格式如下:

{second}{minute}{hour}{day}{month}{day of week}

每1分钟的表达式如下所示:

“0*/1****”


有关计时器触发器的更多信息。

请查看NextVisibleTime属性:


有趣的方法。不幸的是,我不认为设置可见性时间可以解决这个问题。如果消息突发到达,则需要一个编写器来处理所有传入的消息,在仔细计算的增加可见性时间内显式推送队列上的每个消息。如果此处理程序在多个实例中运行,可见性时间如果代码重新启动,它必须跟踪以前的状态。如果队列中有一条消息无法正确使用,它将重新出现以供以后处理(并且无法保证它何时重新出现)。突发消息是我们的问题所在,因为多个并行执行都会在没有协调的情况下发生冲突。使用存储表查找要在可见性中添加的内容不是很好,因为没有锁。我研究了使用队列
批处理大小=1
,但这需要一个单独的应用程序作为
host.json
设置在整个应用程序中都是全局设置。不幸的是,这不是很稳定,而且感觉非常粗糙,所以我认为TimerTrigger将不得不这样做。谢谢!如果有一种方法让函数只在队列中有消息的情况下运行,那就太好了,特别是因为我们只希望它一天运行十几次,所以不要剩下的1400多次运行将无所作为。这似乎是考虑到Azure的功能,可能是最可靠的解决方案,尽管同时有点过火。肯定有优化的方法。但请记住:即使每天每分钟检查一次队列,您的每月存储事务成本也会像……几便士。同样,您的函数使用率似乎低于空闲层的阈值,因此这种设置的成本是最低的。@wkeithvan实际上,队列轮询可以受到限制。您可以了解maxPollingInterval。如果队列中没有消息,这可以使您的函数降低队列检查的频率。频率将更低在您的队列再次出现消息之前。我可能无法清楚地描述它,您可以查看以下内容:@BowmanZhu,它定义了最大间隔,而不是最小间隔。我需要至少1分钟,这将不起作用。此外,这仅可在
主机.json
中配置,因此它将影响所有其他队列触发函数。