Azure Functions EventHub 触发器缩放作业函数实例

标签 azure azure-functions azure-eventhub

我有一个具有 EventHub 触发器和消耗计划的 Azure 函数。在我的测试中,我分几批将 3000 个事件拍摄到事件中心。由于这 3000 个事件的时间几乎比 300 个事件的时间长 10 倍,因此我怀疑此 Azure Function 无法扩展到多个 VM/实例。

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

即使我在 host.json 中指定以下配置,也会发生这种情况: “事件中心”:{ “最大批量大小”:1, “预取计数”:10 }

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

请注意,这并不是应用服务中的唯一功能。这可能是问题所在吗? Function 在多个 VM 上启动需要满足什么条件?

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

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

此 Azure 函数持续 50-250 毫秒,具体取决于负载。 它还通过 Azure 存储队列触发器将事件发送到另一个 Azure 函数。有趣的是,由队列触发器触发的该函数都不会扩展到超过 1 个虚拟机,并且在 eventhub 缓慢触发 azure 函数之前,队列中一开始就有约 1k 条消息。 host.json 中的队列设置是“queues”:{ “最大轮询间隔”:2000, “可见性超时”:“00:00:10”, “批量大小”:32, “最大出队计数”:5, “新批处理阈值”:1 }

谢谢。

最佳答案

这取决于几个因素:

  • 您的事件中心拥有的分区数量以及您正在编写的事件是否分布在各个分区上。 Azure Functions 使用 Event Processor Host处理您的工作负载,在此模式下可以获得的最大规模是每个分区一个虚拟机。
  • 您正在执行的每个事件的工作负载。例如,如果您的函数除了记录之外什么都不做,那么在单个虚拟机上可以在不到 5 秒的时间内处理这 3000 个事件。这不能保证将您的应用程序扩展到多个实例。

但是,如果您正在跨多个分区写入一批事件,总共需要几分钟的时间来处理,并且您没有看到吞吐量随着函数扩展而加速,那么这可能表明某些东西无法正常工作,并且会值得进一步调查。

关于Azure Functions EventHub 触发器缩放作业函数实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482801/

相关文章:

python - 使用 Blob 存储触发器将文件解压缩到 Blob 存储中

powershell - 图像文件是否因 Azure 中的不同订阅而异

rest - 无法为 Azure 文件创建有效的共享访问签名

azure - 在 Linux 上运行的 .NET Core Azure 函数中的 SharePoint CSOM

python - 从另一个 Azure Function 调用 Azure Function

azure - 将事件路由到 eventhub EventProcessor

azure - 如何在适用于 Linux 的 azure web 应用程序中自定义默认错误页面?

sql - 无法从 SQL Server Management Studio 编辑架构或数据

azure - 如何在 Azure Function 中写入 Azure 事件网格主题

java - 如何通过 REST API 在事件中心发送和使用消息