【问题标题】:Why is Azure Eventhub batch message processing faster than single message processing even if Azure function run parallel?为什么即使 Azure 函数并行运行,Azure Eventhub 批处理消息处理也比单个消息处理更快?
【发布时间】:2020-05-13 07:05:15
【问题描述】:

最近,我对使用 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的设置如:batchSize,prefetchCount,checkpoint对这个结果的影响。

你能帮我解释一下吗?

谢谢,

【问题讨论】:

  • 感谢编辑。下次我会注意的。

标签: c# azure parallel-processing azure-functions azure-eventhub


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您提供有用的信息。我正在检查你提到的这些资源。
  • 如果绑定很多,单个处理会占用大量 CPU 资源。通过批处理,我们只需要为一批消息绑定一次。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2019-05-26
    • 2019-09-30
    • 2013-05-22
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多