【问题标题】:Azure Queues - Functions - Message Visibility - Workers?Azure 队列 - 函数 - 消息可见性 - 工人?
【发布时间】:2017-07-22 07:44:59
【问题描述】:

我对有关 Azure 队列、函数和工作器的功能有一些疑问。我不太确定这是如何工作的。

场景:

  • q-notifications 是 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?

【问题讨论】:

    标签: visibility azure-functions azure-storage-queues


    【解决方案1】:

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

    关于横向扩展 - 当您的 Function App 的 N 个实例正在运行时,它们都会合作处理队列。每个队列侦听器将独立地从队列中拉出一批消息以进行处理。实际上,工作将在 N 个实例之间进行负载平衡。正是您想要的 :) Azure Functions 在幕后为您实现了多消费者/工作者模式的所有复杂性。

    【讨论】:

    • 您提到缩放...出于好奇,Azure Functions 如何确定如何缩放托管在应用服务上的队列触发函数应用?队列文档没有提到扩展 (docs.microsoft.com/en-us/azure/azure-functions/…),运行时间部分侧重于消耗计划 (docs.microsoft.com/en-us/azure/azure-functions/functions-scale)。
    • 在消费中,我们监控目标队列,根据队列长度、等待消息的时间等应用启发式方法来确定您的功能是否“跟上”。如果没有,我们添加更多实例以减小队列大小。在非消费模式中,您预先确定有多少实例正在运行。
    • 您能否使用应用服务托管模型在一个 VM 中拥有同一个函数应用的多个实例?还是每个 VM 实例一个?
    • 应用服务计划中的每个 VM 一个
    • 感谢您的回复。哇。 “不要告诉我的老板。”你让我们看起来像摇滚明星。
    【解决方案2】:

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

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

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 2022-01-23
      • 2016-02-06
      • 1970-01-01
      相关资源
      最近更新 更多