限制每个时间跨度的 Azure 持久函数活动最大执行次数的最佳方法

Sam*_*tte 5 azure azure-functions azure-durable-functions

作为 Azure Durable Functions 领域的新手,我正在努力寻找处理对已实施速率限制的 API 的下游调用的最佳方法。

我的流程设置方式如下:

  • HistorySynchronizer_HttpStart函数:在签名中具有HttpTrigger和绑定,并调用下一个编排函数:DurableClient
  • HistorySynchronizer功能:OrchestrationTrigger在签名中有绑定。该函数将调用 API(等待)并返回集合。对于该集合中的每个项目,它将启动一个新的 Activity:(context.CallActivityAsync()将它们组合在 a 中List并执行 a Task.WhenAll()
  • ProcessActivity函数:ActivityTrigger在签名中具有绑定。该函数必须调用速率受限的 API 端点。我想要限制的正是这些活动(跨多个编排)。

所以,我正在寻找的是节流模式的实现:

  • 我需要一个线程安全的共享状态(我正在考虑持久实体)来跟踪对该 API 的调用次数
  • 在 ProcessActivity 函数调用该 API 之前,它必须检查持久实体是否可以调用该 API,或者是否必须在执行该调用之前等待一定的 TimeSpan。
  • 如果必须等待,活动就必须“睡眠”,我正在考虑持久计时器,但似乎应该在编排功能中使用,而不是在活动功能中使用。
  • 如果允许调用 API,活动必须更新该共享状态对象中的速率计数器。

我没有看到实现此目的的标准实现,并且我希望将尽可能多的检查/睡眠逻辑从主编排中移出。

最好的方法是为每个必须限制的 API 调用实现子编排,在调用 Activity 之前必须进行检查吗?

期待任何见解。

l--*_*''' 1

萨姆,我看到了几个选择。我还制作了一个视频作为对此的回应。让我们退后一步,看看如何使用常规函数(不持久)来做到这一点。

第一种方法是将函数变成队列触发函数,并使用队列机制来控制横向扩展,通过使用batchSizenewBatchThreshold

在此输入图像描述

另一种方法是使用 http 触发的函数并在 host.js 文件中使用它:

在此输入图像描述

有了持久函数,我们可以做到这一点:

在此输入图像描述

您特别询问了有关控制每个时间跨度的扩展的问题,这就是我将如何做到这一点:

  1. 将您的活动函数转换为队列触发
  2. 每次执行队列触发函数时,该函数都会在表存储中插入一条记录,表明存在活动运行
  3. 在实际触发外部 http 调用之前,请 ping 表存储以查看有多少活动连接。
  4. 如果当前连接数少于X,则处理消息(即进行外部调用),如果表存储显示所有连接都已占用,则将消息放回队列!