首页 > 解决方案 > Azure Functions Eventhub 输入触发器缩放

问题描述

我们有一个保留 1 天的 EventHub,包含数百万条消息。为了使用它,我们有一个 Azure 函数,它通过事件中心绑定从这个事件中心读取数据。该函数基本上读取原始字节,将其反序列化为 json,进行一些转换,然后将其输出到另一个事件中心。

它需要一个 EventData[] 作为输入,以允许我们一次接收一批 EventData。我们已将其配置为每批接收 1024 条消息。

当我们启动该功能时,它需要重新处理过去 24 小时,它仅使用我们在应用服务计划中可用的 5 个节点中的 1 个,如指标所示:

按实例划分的平均 CPU 百分比

根据文档,缩放应该是这样的:

当您的功能首次启用时,该功能只有一个实例。我们将此函数实例称为 Function_0。Function_0 有一个 EventProcessorHost 实例,它在所有十个分区上都有租约。此实例正在从分区 0-9 读取事件。从现在开始,将发生以下情况之一:

不需要新的函数实例:Function_0 能够在函数缩放逻辑启动之前处理所有 1000 个事件。在这种情况下,所有 1000 个消息都由 Function_0 处理。

添加了一个额外的函数实例:函数缩放逻辑确定 Function_0 的消息多于它可以处理的消息。在这种情况下,将创建一个新的函数应用实例 (Function_1) 以及一个新的 EventProcessorHost 实例。事件中心检测到新主机实例正在尝试读取消息。事件中心跨其主机实例对分区进行负载平衡。例如,可以将分区 0-4 分配给 Function_0,将分区 5-9 分配给 Function_1。

添加了 N 多个函数实例:函数缩放逻辑确定 Function_0 和 Function_1 的消息数量超出了它们的处理能力。创建新的函数应用实例 Function_2...Functions_N,其中 N 大于事件中心分区的数量。在我们的示例中,事件中心再次对分区进行负载平衡,在本例中跨实例 Function_0...Functions_9。

我相信我们会遇到选项 #1,即使我们在事件中心有 24 小时的数据,只有 1 个节点处理数据。以这种速度,处理需要花费数小时,而 4 个节点处于空闲状态。

Azure Function 如何知道在这种情况下何时进行缩放,我们能否影响这种行为?

标签: azureazure-functionsazure-eventhub

解决方案


推荐阅读