如何解决限制每时间跨度Azure持久功能活动的最大执行量的最佳方法
对于Azure持久功能领域而言,我还是很陌生,我正努力寻找最佳方法来处理对已实现速率限制的API的下游调用。
我的流程的设置方式如下:
- HistorySynchronizer_HttpStart 函数:签名中具有
HttpTrigger
和DurableClient
绑定,并调用下一个编排函数: - HistorySynchronizer 函数:签名中具有
OrchestrationTrigger
绑定。此函数将调用API(等待)并取回集合。对于该集合中的每个项目,它将启动一个新的活动:context.CallActivityAsync()
(将它们合并到List
中并执行Task.WhenAll()
) - ProcessActivity 函数:签名中具有
ActivityTrigger
绑定。此函数将必须调用速率受限的API端点。这就是我要限制的活动(跨多个业务流程)。
所以,我要寻找的是一种节流模式的实现:
- 我需要一个线程安全的共享状态(我在考虑持久实体),该状态可以跟踪对该API的调用次数
- 在ProcessActivity函数对该API进行调用之前,它必须与耐久实体进行检查,是否可以调用该API,或者是否必须等待特定的TimeSpan才能执行该调用。
- 万一必须等待,Activity必须“睡眠”,我在考虑一个耐用计时器,但似乎应该在Orchestration函数中使用,而不是在Activity函数中使用。
- 如果允许调用API,则活动必须更新该共享状态对象中的Rate计数器。
我看不到实现此目的的标准实现,我想将大部分Check / Sleep逻辑从主要业务流程中移开。
最好的方法是在调用Activity之前为每个必须节流的API调用实现子流程,检查必须在哪里进行?
期待任何见解。
解决方法
山姆,我看到几个选择。我还创建了一个video作为对此的回应。让我们退后一步,看看如何使用常规函数(不持久)进行此操作。
第一种方法是通过使用batchSize
和newBatchThreshold
将函数转换为队列触发的函数,并使用队列机制来控制横向扩展:
另一种方法是拥有一个http触发的函数,并在host.js文件中使用它:
借助持久功能,我们可以做到这一点:
您专门询问了有关控制每个时间范围内的横向扩展,这就是我的处理方式:
- 将您的活动功能转换为队列触发
- 每次执行由队列触发的函数时,该函数都会在表存储中插入一条记录,指示正在运行中
- 在实际触发外部http调用之前,先对表存储执行ping操作,以查看有多少活动连接。
- 如果当前连接数少于X,则处理消息(即进行外部呼叫),如果表存储显示所有连接均已建立,则将消息放回队列! strong>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。