确保为特定队列扩展的实例数不超过N个

时间:2019-07-09 15:03:01

标签: c# queue azure-functions azure-storage azure-queues

我的功能是将有效载荷发送到不同的sftp服务器。这些服务器在可接受的连接数量上受到限制。

我需要一个解决方案来限制我们与这些服务器的连接。

该功能由存储队列触发,设计的第一稿是:

enter image description here

然后我了解到每个功能只能有1个触发器,这使我陷入了另一个汇总队列:

enter image description here

我可以在始发队列上设置batchSize/newBatchThreshold,但是我不确定这是否可行,因为始发队列不会知道何时将消息推送到聚合队列

  1. 我需要该功能不对来自队列X的所有消息扩展到N个以上的实例,因为sftp服务器X将不接受超过N个连接。
  2. 此外,对于来自队列Y的所有消息,我需要扩展到不超过M个实例的功能,因为sftp服务器Y所接受的连接数不能超过M个。

在上述情况下,实例总数为M + N。

我们如何调整设计以满足这些要求?

2 个答案:

答案 0 :(得分:1)

对此没有100%的防弹解决方案,问题已here跟踪。

最好的方法可能是在功能应用程序的应用程序设置中将WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT设置为1,该设置由聚合队列触发。然后,您应该只获得一个Function App的并发实例,因此batchSize设置实际上对速率限制很有用。

在这种情况下,您不需要限制队列处理器X / Y / Z,让消息流向聚合。

现在,我不知道是否只有来自队列X的消息触及SFPT X,或者它是多对多的。如果是一对一,则可以摆脱聚合队列,拥有三个功能并分别限制每个队列的并发性。

无论如何,限制设置如上所述。

如果仍然不能满足您的要求,则可以切换到另一个消息服务。例如,将一种类型的所有消息发送到服务总线的单独会话或事件中心的单个分区中,这自然会限制代理级别的并发性。

答案 1 :(得分:1)

选项1:取决于sftp的错误响应

sftp服务器是否返回429(请求太多)响应?还是类似的东西?当您收到这样的响应时,您可以直接从函数中退出,而无需从队列中删除消息。该消息将在30秒后再次变为可见,并触发一个功能。 30秒是PA_DIR="/home/myname/some_folder" screen -dm -S S1 bash -c 'sudo java -Dconfig.file=$PA_DIR/google.conf -jar ~/big/cromwell-42.jar run $PA_DIR/WholeGenomeGermlineSingleSample.wdl -i test.json -o $PA_DIR/au_options.json > FDP1.log 2>&1' 的默认值,是每msg的customizable on

选项2:分布式锁

我从头顶上不知道带有计数器的分布式锁定解决方案。一种替代方法是使用SQL数据库和原子事务自行实现锁定解决方案。处理来自队列X的消息时,一个函数将查看db以查看X的锁定计数器是否小于N,如果是,则将其增加1,然后处理该消息。在这种情况下,即使您的函数崩溃,也必须确保释放锁。也就是说,使用租约到期时间实现锁。