为什么 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的设置如:batchSize
、prefetchCount
、checkpoint
对这个结果的影响。
你能帮我解释一下吗?
谢谢,
批处理不会阻止函数扩展到多个实例。假设您 运行 消费或高级计划的两个版本,batch processing is expected 有更快的处理时间。
通过调整 batchSize 和预取计数来最大化吞吐量可能会有所不同,但将针对您的特定用例进行一些测试以确定最佳设置是什么。
scaling outward 还有两件事需要考虑。流量激增不会立即导致缩放控制器启动大量实例。
- 缩放控制器一次只能缩放一个实例。在消耗计划中,HTTP 功能的超时时间为 1 秒,非 HTTP 功能的超时时间为 30 秒。由于单个实例通常可以一次处理多条消息,因此这与处理速率没有 1:1 相关性。
- 每个新实例都会有一个预热时间,并且不能立即接受消息。这可能会有所不同,但通常只需几秒钟。
批处理速度更快,因为它只使用绑定一次来处理多个事件中心消息。
绑定就是反射,所以绑定越多,消耗越CPU。
最近,我对使用 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
对这个结果的影响。
你能帮我解释一下吗?
谢谢,
批处理不会阻止函数扩展到多个实例。假设您 运行 消费或高级计划的两个版本,batch processing is expected 有更快的处理时间。
通过调整 batchSize 和预取计数来最大化吞吐量可能会有所不同,但将针对您的特定用例进行一些测试以确定最佳设置是什么。
scaling outward 还有两件事需要考虑。流量激增不会立即导致缩放控制器启动大量实例。
- 缩放控制器一次只能缩放一个实例。在消耗计划中,HTTP 功能的超时时间为 1 秒,非 HTTP 功能的超时时间为 30 秒。由于单个实例通常可以一次处理多条消息,因此这与处理速率没有 1:1 相关性。
- 每个新实例都会有一个预热时间,并且不能立即接受消息。这可能会有所不同,但通常只需几秒钟。
批处理速度更快,因为它只使用绑定一次来处理多个事件中心消息。 绑定就是反射,所以绑定越多,消耗越CPU。