为什么 Azure Eventhub 批处理消息处理比单个消息处理更快,即使 Azure 函数 运行 并行?

Why is Azure Eventhub batch message processing faster than single message processing even if Azure function run parallel?

最近,我对使用 Azure Function 和 Azure Event Hub 的应用程序进行了性能测试。

单条消息处理:

pubic async Task Run(EventData msg, CloudTable myTable) 
{
    await myTable.Upsert(msg.ToTableEntity());
}

批量消息处理:

public async Task Run(EventData[] messages, CloudTable myTable)
{
    var tasks = messages.Select(async msg => await Handle(msg, myTable)).ToList();
    await Tasks.WhenAll(tasks);
}

private async Task Handle(EventData msg, CloudTable myTable)
{
    await myTable.Upsert(msg.ToTabletEntity());
}

批量消息处理速度比单条消息处理快15%

我希望它们具有相同的速度,因为 Azure 函数并行处理消息。

我在思考host.json的设置如:batchSizeprefetchCountcheckpoint对这个结果的影响。

你能帮我解释一下吗?

谢谢,

批处理不会阻止函数扩展到多个实例。假设您 运行 消费或高级计划的两个版本,batch processing is expected 有更快的处理时间。

通过调整 batchSize 和预取计数来最大化吞吐量可能会有所不同,但将针对您的特定用例进行一些测试以确定最佳设置是什么。

scaling outward 还有两件事需要考虑。流量激增不会立即导致缩放控制器启动大量实例。

  1. 缩放控制器一次只能缩放一个实例。在消耗计划中,HTTP 功能的超时时间为 1 秒,非 HTTP 功能的超时时间为 30 秒。由于单个实例通常可以一次处理多条消息,因此这与处理速率没有 1:1 相关性。
  2. 每个新实例都会有一个预热时间,并且不能立即接受消息。这可能会有所不同,但通常只需几秒钟。

批处理速度更快,因为它只使用绑定一次来处理多个事件中心消息。 绑定就是反射,所以绑定越多,消耗越CPU。