当前位置: 首页 > 知识库问答 >
问题:

Azure函数:使用队列触发器和消费计划上的FunctionalPpscaleLimit扩展和并发

陆承宣
2023-03-14

我在Linux消费计划上有一个Azure函数应用程序,它有两个队列触发器。两个队列触发器都将<code>batchSize

如果我希望允许这两个队列触发器并发运行,但不希望它们的规模超过这个范围,那么将< code > functionAppScaleLimit 设置为< code>2是否足以实现这一点?

编辑:添加了新的示例,感谢@Hury沈为这些示例提供框架

现在,我想我将继续使用最后一个示例,但在将来,如果我升级到高级计划,我可以安全地将<code>functionAppScaleLimit<code>设置为<code>2<code>或<code>3<code>。我还将测试两个队列触发器,它们使用2functionAppScaleLimit,侦听不同的存储队列,但我怀疑最安全的做法是为该场景中的每个队列触发器创建单独的Azure函数应用程序。

编辑 2:在一个函数应用中为两个队列触发器添加示例

在< code > functionAppScaleLimit 设置为< code>2的情况下,两个队列触发器同时运行,看起来规模限制不起作用。微软的人能解释一下吗?官方文档(https://docs . Microsoft . com/en-us/azure/Azure-functions/functions-scale # limit-scale-out)中并没有警告这个设置处于预览模式,然而我们可以清楚地看到,当限制设置为2时,Azure函数正在向外扩展到4个实例。在下面的例子中,看起来限制得到了遵守,但是功能不是我想要的,我们仍然看到@Hury Shen的回答中存在的等待。

结论< br >要使用队列触发器来限制Azure函数中的并发性和控制缩放,您必须将您的Azure函数限制为每个函数应用程序使用一个队列触发器,并使用< code>batchSize和< code > functionAppScaleLimit 设置。如果使用多个队列触发器,您将会遇到可能导致超时的竞争条件和等待。

共有1个答案

房项禹
2023-03-14

是的,您只需要将functionAppScaleLimit设置为2。但关于消费计划,你需要了解一些机制。我用<code>batchSize(我在函数app的“应用程序设置”中将<code>WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT</code>设置为 ,而不是设置<code>功能ppscaleLimit</code>,它们是相同的)。我用下面的代码进行测试:

import logging
import azure.functions as func
import time

def main(msg: func.QueueMessage) -> None:
    logging.info('=========sleep start')
    time.sleep(30)
    logging.info('=========sleep end')
    logging.info('Python queue trigger function processed a queue item: %s',
                 msg.get_body().decode('utf-8'))

我将“s2”到“s4”的单元格设为黄色,因为这段时间指的是功能任务的执行时间。

根据excel的截图,我们可以推断出以下几点:

最大实例数只能扩展到2,因为我们可以找到它在excel表的每行中不存在两个以上的黄色单元格。因此,正如您在问题中提到的,该函数不能扩展到2个以上的实例。

2.你想让这两个队列触发器同时运行,可以实现。但是实例会通过消耗机制横向扩展。简单来说,当一个函数实例被一条消息触发,还没有完成任务,现在有另一条消息进来时,它不能确保使用另一个实例。第二条消息可能正在等待第一个实例。我们无法控制是否启用另一个实例。

=====更新==============================

由于我不太清楚您的描述,我不确定您要侦听多少个存储队列,以及您在这边创建了多少函数应用程序和QueueTrigger函数。我总结我的测试结果如下,供您参考:

1.对于您关于<code>的问题,您在保费计划中描述的最大突发事件是否与此不同我认为如果我们选择premium plan,实例也将使用相同的消费计划机制进行扩展。

2.如果需要监听两个存储队列,当然我们应该创建两个QueueTrigger函数来监听每个存储队列。

3.如果您只需要监听一个存储队列,我将使用三种情况进行测试(在所有三种情况下,我将最大规模实例设置为2):

A) 在一个函数应用程序中创建一个QueueTrigger函数,以侦听一个存储队列。这是我在原始答案中测试的,excel表显示了实例将根据消费计划的机制扩展,我们无法控制它。

B) 在一个函数应用程序中创建两个QueueTrigger函数,以侦听同一存储队列。结果与案例A几乎相同,我们无法控制使用多少实例来处理消息。

C)创建两个函数应用程序并在每个函数应用程序中创建一个QueueTrigger函数以侦听相同的存储队列。结果也类似于情况A和B,不同之处在于最大实例可以缩放到4,因为我创建了两个函数应用程序(它们都可以缩放到2个实例)。

总之,我认为这三种情况都是相似的。虽然我们选择了第三种情况,但是创建两个函数应用程序,每个应用程序中有一个QueueTrigger函数。我们也不能确保第二个消息立即被处理,它仍然可能被处理到第一个实例,并等待第一个实例完成处理第一个消息。

因此,在这篇文章< code >中,您当前问题的答案是将functionAppScaleLimit设置为2足以实现这一点吗?是:如果您希望两个实例能够并发运行,我们无法确保这一点。如果您只想用两个实例来处理消息,答案是肯定的。

 类似资料:
  • 在.NET core 2.0中使用创建时,我遇到了一个问题。 在体系结构中,当在用于创建用户的队列中创建新消息时,服务必须接收该消息并根据其中的信息在数据库中创建用户。 在Visual Studio2017中,我在下创建了一个新项目。 这种的正确实现是什么?在GitHub上有什么例子吗?提前道谢。

  • 我在使用 blob 触发器的消费计划上创建了一个 Azure 函数。然后,我向 Blob 添加大量文件,并且我希望每次将文件添加到触发器时都会调用 Azure 函数。 因为我使用Azure函数和消耗计划,所以我希望不存在可伸缩性问题,对吗?错。 我可以轻松地将文件添加到blob中,速度比Azure函数处理它们的速度快。一百个用户可以添加到blob中,但在任何时候似乎只有一个Azure函数的实例在工

  • 我有一个Java项目,它使用了一些Azure函数,如HttpTrigger和QueueTrigger。我使用原型来生成这个项目,因此它可以使用HttpTrigger的一些样板代码和它的单元测试,但对QueueTrigger没有任何帮助。我正试图得到帮助,为这个QueueTrigger编写一个好的单元测试,它实际上是从队列中读取消息(弹出)。队列的代码如下所示: 有没有人能推荐一下这个队列触发azu

  • 本文向大家介绍azure-webjobs 队列触发器,包括了azure-webjobs 队列触发器的使用技巧和注意事项,需要的朋友参考一下 示例 一个简单的示例,定义一个由队列消息触发的功能: 它还支持POCO序列化:            

  • 我正在尝试将托管标识与Azure功能V3和QueueTrigger一起使用。功能代码的定义如下: 根据微软留档这应该是可能的通过定义一些额外的配置属性 https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference?tabs=blob#local-development-with-identity-based-c

  • 我已经审阅了Microsoft提供的关于触发器的文档。[https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=python][1] 事实上,在Azure函数中使用参数允许我们检索blob和一些属性(),我们还可以使用函数读取字节,但是我们如何将字节转换为