2017-04-18 125 views
0

我有一个具有EventHub触发器和消费计划的Azure函数。在我的测试中,我将3000个事件用于几个批次的事件中心。由于3000个事件的时间几乎比300个事件的时间大10倍,所以我怀疑这个Azure功能没有扩展到多个虚拟机/实例。Azure函数EventHub触发器缩放作业函数实例

为了验证这个假设,我使用了一个Guid静态变量,我初始化了一次并记录在函数的每次运行中。所有3000次运行都记录了相同的Guid。

即是即使我指定host.json以下配置: “eventHub”:{ “maxBatchSize”:1, “prefetchCount”:10 }

逻辑的是,这会限制的并行处理在单个实例中,因此会启动多个实例,但同样只有1个Guid被记录。

请注意,这不是App Service中唯一的功能。这可能是问题吗?需要满足什么条件才能在多个虚拟机上启动功能?

编辑: 我有32个分区和20个可以通过单元。第一个问题是我使用SendBatchAsync,它不分区事件。即使SendAsync没有带来任何规模,就像它没有分区一样。因此,我创建了分区的eventhub发件人,并在客户端应用程序中发送事件时进行了循环分区。

AzureFunction处理的事件数量增加,但仍未创建超过1个虚拟机。此外,每秒处理的事件数量在开始时(每个时刻约200个)要大得多,在2000个事件之后或接近结束时,它们降至〜5。这与系统负载无关,因为在9000次事件中观察到同样的行为,在〜5k事件之后发生减速。

此Azure功能持续50-250毫秒,具体取决于负载。 它还通过Azure存储队列触发器将事件发送到另一个Azure功能。有趣的是,由队列触发器触发的这个函数不会扩展到1个以上的虚拟机,并且在eventhub缓慢触发天蓝色函数之前,它在开始时队列中有1k条消息。在host.json队列设置为 “队列”:{ “maxPollingInterval”:2000, “visibilityTimeout”: “00:00:10”, “BATCHSIZE”:32, “maxDequeueCount”:5, “newBatchThreshold” :1 }

谢谢。

+0

这些事件分布在多少个分区? – Mikhail

+0

事件中心有32个分区。我开始使用分区的eventhub发送器,并且性能稍微好一些,但仍然只使用了1个虚拟机。 – Vukasin

回答

1

这取决于几个因素:

  • 您的活动中心已经和是否你正在写的事件正在整个你的分区分布式分区的数量。 Azure函数使用Event Processor Host来处理您的工作负载,您可以在此模式下获得的最大规模是每个分区一个VM。
  • 您正在执行的每个事件工作负载。例如,如果您的功能除了记录之外什么也不做,那么可以在单个虚拟机上在不到5秒内处理这些3000个事件。这不会保证将您的应用程序扩展到多个实例。

但是如果你正在写一个批处理跨越几个分区的事件这需要几分钟的总处理和你没有看到你的吞吐量加速为您的功能可扩展至那么这可能表明有什么不工作正确并且需要进一步调查。

+0

我有32个分区。第一个问题是我使用SendBatchAsync,它不分区事件。即使SendAsync没有带来任何规模,就像它没有分区一样。因此,我创建了分区的eventhub发件人,并在客户端应用程序中发送事件时进行了循环分区。 – Vukasin

+0

我已经编辑了更多信息的问题。感谢你的回答。 – Vukasin

+1

加上Paul的评论,每个Function实例都由1个EventProcessorHost(EPH)支持。 EventHub只允许1个EPH在分区上保留租约,但是可以为1个分区分配一个EPH。开始时,您有1个函数实例=> 1个EPH(EPH0)。 EventHub检测到EPH0正在尝试连接到它并将所有32个分区分配给它。如果EPH0能够在缩放逻辑开始之前处理所有事件,那么您将只需要1个函数实例。有关详细信息,请参阅http://stackoverflow.com/questions/42901284/azure-functions-event-hub-trigger-bindings/42911842#42911842 –