同一事件中心分区内的 Azure Function App 调用

标签 azure azure-functions azure-eventhub

我可以向您确认一下,当我们有一个具有多个分区的事件中心时, 是否有可能在同一分区上拥有多个处理事件的 Azure Function 实例?

例如(假设我们接受事件批处理):

  1. 事件批处理 1 到达并触发 Azure Function。
  2. 然后,当上一个批处理的 Azure Function 仍在处理时,事件批处理 2 到达并触发 Azure Function 的另一个实例来处理批处理 2,即使上一个批处理尚未完成

上述情况可能吗?或者是否已确认每个分区仅允许一个 Azure Function 实例?也就是说,只有第1批处理完成后,才能调用下一批Azure Function。

一些线程说单个分区可以有并行调用。 text

我也看到了这篇文章text因为我想确保在一个 Azure 事件中心分区内进行顺序处理。但是,我不确信当不同批处理的 2 个 Azure Function 实例可以在同一分区中运行时是否可以保留顺序,因为可能存在竞争条件,从而扰乱顺序。

希望您能澄清这里的概念。谢谢!

最佳答案

简而言之,是的。在一个特定场景中,可能会看到两个实例处理一两个批处理的同一分区。讨论单调度并行执行的链接线程是不正确的。

分区和所有权

一般来说,每个分区只能有一个事件读取器。但是,当实例扩展和分区所有权重新平衡时,可能有两个 Function 实例在一小段时间的重叠(1-2 个批处理)内为同一分区分派(dispatch)事件。

如果旧所有者将事件保存在内存中并分派(dispatch)它们,则它可能不知道该分区有新所有者。旧所有者在下次尝试读取时或当触发器的负载平衡循环滴答时(默认情况下为 30 秒)就会意识到更改。此时,旧所有者不再被允许从分区读取数据,并将在您的代码完成处理当前事件/批处理后停止调度事件。

在这种情况之外,任何分区都不会进行并行处理。无论使用单分派(dispatch)还是多分派(dispatch),每次调用函数来执行处理时,触发器都会等待该调用完成(如果需要,则等待检查点),然后再从该分区分派(dispatch)另一个事件。

排序和复制

关于排序,一般保证触发器将按照事件在分区中出现的顺序分派(dispatch)每个事件。但是,您可能会看到倒带,其中触发器重新定位到较早的时间点并重播事件。当发生扩展和所有权重新平衡、主机崩溃或迁移、或者运行时出现异常导致触发器重新启动时,就会发生这种情况。

这将导致触发器将其读取器定位在最后写入的检查点并从那里开始调度。从那时起,事件将按顺序阅读。但是,对于您的应用程序来说,排序将会被打乱,并且它将看到它已经处理过的事件。

简而言之,您的应用程序必须记住事件中心“至少一次”保证,并确保处理是幂等的并且可以处理回滚。

关于同一事件中心分区内的 Azure Function App 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76669194/

相关文章:

node.js - 查询结果达到 500+ 后,Mongoose find 查询与 populate 在 Azure MongoDB 上返回错误

Azure API 管理(策略)

azure - Azure IoT Hub的多个接收器,如何设置Azure函数的Epoch值?

c# - 无法将.Net Core 2.0项目的项目引用添加到Azure函数项目(netStandard2.0)

azure - 耐用功能: Return Result from Orchestrator

c# - 获取 Azure EventHub 的项目计数

azure - 目前是否可以从 Service Fabric 群集诊断扩展将 ETW 流式传输到事件中心?

android - 使用 Windows Azure 在 Android 上推送通知

azure 服务总线 maxConcurrentCalls 完全被忽略

无法通过专用终结点进行 Azure 事件网格交付 - 有哪些替代方案?