Azure Functions 事件中心触发器绑定
Azure Functions Event Hub trigger bindings
关于在 IoT 场景中将 Azure Functions 与 EventHub 结合使用的几个问题。
- EventHub 有分区。通常来自特定设备的消息会发送到同一分区。 Azure Functions 的实例如何跨 EventHub 分区分布?是基于性能吗?如果 Azure Functions 的一个实例设法处理来自所有分区的事件,那么这就足够了,否则每个 EventHub 分区可能最终只有一个 Azure Functions 实例?
- 读取偏移量呢?这个绑定是否以某种方式记录它停止读取事件流的位置?我认为这些函数应该是无状态的,而这里我们有一些状态。
谢谢
函数应用程序基于 WebJobs SDK,它使用 EventHostProcessor
从事件中心使用事件。因此,您可以查找有关 EventHostProcessor
的信息,它将适用于您的 Function App。
具体来说,你可以找到IEventProcessor
的实现
here.
针对您的问题:
不确定 "one instance" 是什么意思。将为每个分区创建一个侦听器,但如果负载较低,它们可以同时托管在单个应用计划实例中。在高级别上,您不应该太在意:在消费计划中,您按执行时间付费,无论有多少 servers/processes/threads 是 运行。当然,你应该关心自动缩放是否适用于高负载,但无论如何都需要测试。
从某种意义上说,函数是无状态的,您不能在两次函数执行之间在内存中保存任何内容。您完全可以将状态保存在外部存储中。 Function App 将使用 PartitionContext.CheckpointAsync()
作为当前偏移量的检查点。 Azure 存储在内部使用;您可以再次阅读有关它在事件中心和 EventHostProcessor
文档中如何工作的更多信息,例如here.
事件中心触发函数的每个实例仅由 1 个 EventProcessorHost(EPH) 实例支持。事件中心确保只有 1 个 EPH 可以获得给定分区上的租约。
问题 1 的答案:
让我们用一个人为的例子来详细说明这一点。假设我们从 EventHub 的以下设置和假设开始:
- 10 个分区。
- 1000 个事件均匀分布在所有分区中 => 每个分区中有 100 条消息。
首次启用您的函数时,只有 1 个函数实例。我们称这个函数实例为Function_0。 Function_0 将有 1 个 EPH 设法获得所有 10 个分区的租约。让这个 EPH 被称为 EPH_0,它将开始从分区 0-9 读取事件。从此时开始,将发生以下情况之一:
只需要1个函数实例-Function_0能够处理所有1000个之前Azure Functions 的缩放逻辑开始运行。
因此,所有 1000 条消息都由 Function_0.
处理
再添加 1 个 Function 实例 - Azure Functions 的缩放逻辑确定 Function_0 似乎很慢, 所以一个新实例
Function_1 被创建,导致 EPH_1。事件中心检测到一个新的 EPH 实例正在尝试读取消息。事件中心将开始加载
平衡 EPH 实例之间的分区,例如分区
0-4 分配给 EPH_0,分区 5-9 分配给 EPH_1。
如果所有函数执行成功且没有错误,EPH_0和
EPH_1 检查点成功,所有 1000 条消息都已处理。当检查点成功时,所有 1000 条消息都不应再次检索。
再添加 N 个函数实例 - Azure Functions 的缩放逻辑确定 Function_0 和Function_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 不会尝试更改该行为。如果没有重复的消息是一个优先事项,那么您将需要在您的工作流程中减少它。因此,当检查点失败时,如果您的函数正在批处理级别处理消息,则需要管理更多重复消息。
关于在 IoT 场景中将 Azure Functions 与 EventHub 结合使用的几个问题。
- EventHub 有分区。通常来自特定设备的消息会发送到同一分区。 Azure Functions 的实例如何跨 EventHub 分区分布?是基于性能吗?如果 Azure Functions 的一个实例设法处理来自所有分区的事件,那么这就足够了,否则每个 EventHub 分区可能最终只有一个 Azure Functions 实例?
- 读取偏移量呢?这个绑定是否以某种方式记录它停止读取事件流的位置?我认为这些函数应该是无状态的,而这里我们有一些状态。
谢谢
函数应用程序基于 WebJobs SDK,它使用 EventHostProcessor
从事件中心使用事件。因此,您可以查找有关 EventHostProcessor
的信息,它将适用于您的 Function App。
具体来说,你可以找到IEventProcessor
的实现
here.
针对您的问题:
不确定 "one instance" 是什么意思。将为每个分区创建一个侦听器,但如果负载较低,它们可以同时托管在单个应用计划实例中。在高级别上,您不应该太在意:在消费计划中,您按执行时间付费,无论有多少 servers/processes/threads 是 运行。当然,你应该关心自动缩放是否适用于高负载,但无论如何都需要测试。
从某种意义上说,函数是无状态的,您不能在两次函数执行之间在内存中保存任何内容。您完全可以将状态保存在外部存储中。 Function App 将使用
PartitionContext.CheckpointAsync()
作为当前偏移量的检查点。 Azure 存储在内部使用;您可以再次阅读有关它在事件中心和EventHostProcessor
文档中如何工作的更多信息,例如here.
事件中心触发函数的每个实例仅由 1 个 EventProcessorHost(EPH) 实例支持。事件中心确保只有 1 个 EPH 可以获得给定分区上的租约。
问题 1 的答案: 让我们用一个人为的例子来详细说明这一点。假设我们从 EventHub 的以下设置和假设开始:
- 10 个分区。
- 1000 个事件均匀分布在所有分区中 => 每个分区中有 100 条消息。
首次启用您的函数时,只有 1 个函数实例。我们称这个函数实例为Function_0。 Function_0 将有 1 个 EPH 设法获得所有 10 个分区的租约。让这个 EPH 被称为 EPH_0,它将开始从分区 0-9 读取事件。从此时开始,将发生以下情况之一:
只需要1个函数实例-Function_0能够处理所有1000个之前Azure Functions 的缩放逻辑开始运行。 因此,所有 1000 条消息都由 Function_0.
处理
再添加 1 个 Function 实例 - Azure Functions 的缩放逻辑确定 Function_0 似乎很慢, 所以一个新实例 Function_1 被创建,导致 EPH_1。事件中心检测到一个新的 EPH 实例正在尝试读取消息。事件中心将开始加载 平衡 EPH 实例之间的分区,例如分区 0-4 分配给 EPH_0,分区 5-9 分配给 EPH_1。
如果所有函数执行成功且没有错误,EPH_0和 EPH_1 检查点成功,所有 1000 条消息都已处理。当检查点成功时,所有 1000 条消息都不应再次检索。再添加 N 个函数实例 - Azure Functions 的缩放逻辑确定 Function_0 和Function_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 不会尝试更改该行为。如果没有重复的消息是一个优先事项,那么您将需要在您的工作流程中减少它。因此,当检查点失败时,如果您的函数正在批处理级别处理消息,则需要管理更多重复消息。