2017-03-02 114 views
2

我对Azure队列,函数和Worker的功能有一些疑问。我不确定这是如何工作的。Azure队列 - 功能 - 消息可见性 - 工作者?

场景:

  • Q-通知处于Azure存储帐户的队列。
  • f-process-notification是Azure中与q-notifications绑定的函数。它的工作是在队列中获得第一条消息并处理它。

理论上,当消息被添加到q-notifications时,应该调用函数f-process-notification。

问题:

  1. 是否触发功能代替需要有工?换句话说,每次将消息放入队列中时都会调用f-process-notification。

  2. 假设我在可见性超时为5分钟的队列中放置消息。基本上我排队的消息,但它不应该采取行动,直到5分钟过去。当消息放入队列时,队列是否会立即触发f-process-notification,或者只有在消息变为可见时(即将队列放入队列后5分钟)才会触发f-process-notification?

回答

3

在Azure函数中,运行您的队列触发函数的每个函数应用程序实例都将拥有其自己的目标队列侦听器。它使用指数退避策略监控队列中的新工作。当新项目添加到队列中时,监听器将从队列中提取多个项目(批处理行为是可配置的),然后将并行发送到您的函数。如果您的功能成功,该消息将被删除,否则它将保留在队列中进行重新处理。要回答您的问题 - 是的,我们尊重您指定的任何知名度超时。如果消息以超过5分钟的时间添加,则只会在此之后处理。

关于扩展 - 当你的Function App的N个实例正在运行时,它们将全部合作处理队列。每个队列侦听器将独立地将批量消息从队列中拉出来处理。实际上,这些工作将在N个实例中进行负载平衡。正是你想要的:) Azure函数在幕后为你实现了多重消费者/工作者模式的所有复杂性。

+1

您提到规模......出于好奇,Azure函数将如何确定如何缩放我的队列触发功能应用程序托管在App Service上?队列文档没有提到缩放(https://docs.microsoft.com/zh-cn/azure/azure-functions/functions-bindings-storage-queue),而“运行时”部分则集中在“消费计划”(https:// docs.microsoft.com/en-us/azure/azure-functions/functions-scale)。 –

+2

在消费中,我们监控目标队列,应用基于队列长度的启发式,等待消息的年龄等,以确定您的功能是否“保持”。如果不是,我们添加更多的实例来减小队列大小。在非消费中,您可以预先确定有多少实例正在运行。 – mathewc

+0

您是否可以使用App Service托管模型在一个虚拟机中使用同一个Function App的多个实例?或者它每个VM实例一个? –

0

我通常使用侦听器逻辑而不是触发器。消费者不断地监视队列中的消息。如果您有多个使用者,例如处理相同总线/队列的不同Azure辅助角色中的消费代码有5个实例,则获得消息的第一个消费者将获胜(他们是“竞争对手”)。这提供了SOA体系结构中常见的扩展场景。

本文介绍延迟处理的一些方法。

http://markheath.net/post/defer-processing-azure-service-bus-message

好运!