Azure Functions 事件中心触发器绑定

Azure Functions Event Hub trigger bindings

关于在 IoT 场景中将 Azure Functions 与 EventHub 结合使用的几个问题。

谢谢

函数应用程序基于 WebJobs SDK,它使用 EventHostProcessor 从事件中心使用事件。因此,您可以查找有关 EventHostProcessor 的信息,它将适用于您的 Function App。

具体来说,你可以找到IEventProcessor的实现 here.

针对您的问题:

  1. 不确定 "one instance" 是什么意思。将为每个分区创建一个侦听器,但如果负载较低,它们可以同时托管在单个应用计划实例中。在高级别上,您不应该太在意:在消费计划中,您按执行时间付费,无论有多少 servers/processes/threads 是 运行。当然,你应该关心自动缩放是否适用于高负载,但无论如何都需要测试。

  2. 从某种意义上说,函数是无状态的,您不能在两次函数执行之间在内存中保存任何内容。您完全可以将状态保存在外部存储中。 Function App 将使用 PartitionContext.CheckpointAsync() 作为当前偏移量的检查点。 Azure 存储在内部使用;您可以再次阅读有关它在事件中心和 EventHostProcessor 文档中如何工作的更多信息,例如here.

事件中心触发函数的每个实例仅由 1 个 EventProcessorHost(EPH) 实例支持。事件中心确保只有 1 个 EPH 可以获得给定分区上的租约。

问题 1 的答案: 让我们用一个人为的例子来详细说明这一点。假设我们从 EventHub 的以下设置和假设开始:

  1. 10 个分区。
  2. 1000 个事件均匀分布在所有分区中 => 每个分区中有 100 条消息。

首次启用您的函数时,只有 1 个函数实例。我们称这个函数实例为Function_0Function_0 将有 1 个 EPH 设法获得所有 10 个分区的租约。让这个 EPH 被称为 EPH_0,它将开始从分区 0-9 读取事件。从此时开始,将发生以下情况之一:

  1. 只需要1个函数实例-Function_0能够处理所有1000个之前Azure Functions 的缩放逻辑开始运行。 因此,所有 1000 条消息都由 Function_0.

  2. 处理
  3. 再添加 1 个 Function 实例 - Azure Functions 的缩放逻辑确定 Function_0 似乎很慢, 所以一个新实例 Function_1 被创建,导致 EPH_1。事件中心检测到一个新的 EPH 实例正在尝试读取消息。事件中心将开始加载 平衡 EPH 实例之间的分区,例如分区 0-4 分配给 EPH_0,分区 5-9 分配给 EPH_1

    如果所有函数执行成功且没有错误,EPH_0EPH_1 检查点成功,所有 1000 条消息都已处理。当检查点成功时,所有 1000 条消息都不应再次检索。

  4. 再添加 N 个函数实例 - Azure Functions 的缩放逻辑确定 Function_0Function_1 仍然低迷并且 将为 Function_2...N 再次重复工作流程 2,其中 N>9。事件中心将在 Function_0...9 个实例之间对分区进行负载平衡。

    Azure Functions 当前缩放逻辑的独特之处在于 N 是 >(分区数)。这样做是为了确保 总是有 EPH 的实例可以快速使用 锁定分区。作为客户,您只需为 Function 实例执行时使用的资源付费,但无需为这种超额配置付费。

问题 2 的答案: EPH 使用检查点机制来标记最后已知的成功读取消息。可以将 EventHub 触发的函数设置为一次处理一条消息或一批消息。您选择的选项需要考虑以下因素:

1.消息处理速度 - 批量处理消息而不是一次处理一条消息是 因素之一 将加快 Azure Functions 工作流保持能力的能力处理事件中心中的传入消息。

2。重复容忍度 - 如果由于 函数代码中的错误导致检查点失败/(2017 年 8 月 24 日更新)timeout/partition 最少丢失,然后下一个在该分区上获得租约的 EPH 将开始从最后一个已知检查点检索消息。事件中心保证 at-least-once 交付但不保证 at-most-once 交付。 Azure Functions 不会尝试更改该行为。如果没有重复的消息是一个优先事项,那么您将需要在您的工作流程中减少它。因此,当检查点失败时,如果您的函数正在批处理级别处理消息,则需要管理更多重复消息。