我们有一个EventHub,保留了1天,其中包含数百万条消息。为了使用它,我们有一个Azure函数,它通过Event Hub Binding从此事件中心读取。该函数基本上读取原始字节,将其反序列化为json,进行一些转换,然后将其输出到另一个事件中心。
它需要一个EventData []作为输入,以允许我们一次接收一批EventData。我们已将其配置为每批接收1024条消息。
当我们启动该功能时,它需要重新处理过去的24小时,它仅使用了应用服务计划中可用的5个节点中的1个,如指标所示:
根据docs,缩放应如下所示:
首次启用该功能时,该功能只有一个实例。我们将此函数实例称为Function_0。 Function_0有一个EventProcessorHost实例,该实例在所有十个分区上都有租约。该实例正在从分区0-9读取事件。从现在开始,发生以下情况之一:
不需要新的功能实例:Function_0能够处理所有1000个事件,然后再调用Function扩展逻辑。在这种情况下,所有1000条消息都由Function_0处理。
添加了一个附加功能实例:Functions缩放逻辑确定Function_0包含的消息数量超出其处理能力。在这种情况下,将创建一个新的函数应用程序实例(Function_1),以及一个新的EventProcessorHost实例。事件中心检测到新的主机实例正在尝试读取消息。事件中心在其主机实例之间均衡分区。例如,可以将分区0-4分配给Function_0,将分区5-9分配给Function_1。
添加了N个功能实例:Functions缩放逻辑确定Function_0和Function_1的消息数量超出其处理能力。将创建新的功能应用程序实例Function_2 ... Functions_N,其中N大于事件中心分区的数量。在我们的示例中,事件中心再次负载均衡了分区,在这种情况下跨实例Function_0 ... Functions_9。
我相信,即使事件中心有24小时的数据,只有1个节点在处理数据,我们还是会选择方法1。以这种速率,需要花费数小时才能处理,而4个节点处于空闲状态。
在这种情况下,Azure Function如何知道何时扩展?我们可以影响这种行为吗?