【发布时间】:2021-01-07 07:26:41
【问题描述】:
我制作了一个应用程序,它使用持久的 azure 函数 fan-out strategy 通过向我们自己的内部 API 发送 http 请求来对数据库进行并行查询和更新。
我发现扇出策略比使用 TPL library 并在普通 .net Core webapp 上以这种方式进行并行处理要慢得多。它不仅慢,而且慢了大约 20 倍。 130 次更新需要 10 分钟,而我为速度比较而制作的 .net core 3.1 应用程序执行完全相同的操作在 0.5 分钟内完成 130 次更新,而且计划要低得多。
我知道由于持久的框架基础架构(与存储帐户等通信)存在延迟,但我看不出这种速度差异是正常的。每个单独的更新都发生在 ActivityTrigger 函数中,编排器负责收集所有必要的更新并将它们放入 Task.WhenAll() 调用中,就像 Microsoft 文档中的示例一样。
我在这里做错了吗?这个业务场景可能与该技术不兼容吗?代码似乎工作正常,并行性工作它只是比 .net 核心应用程序慢很多。另一件要提到的是,当函数打开第二个实例时(由于它处于消耗计划并自然地打开第二个实例以处理重负载,或者它处于 appservice 计划中并且我手动打开一个实例)它甚至尽管 cpu 负载在两个实例中以某种方式平衡,但速度较慢。我怀疑这可能是由于两个实例之间的天蓝色队列通信导致的额外延迟,但我不完全确定。
最后一个细节是,该应用还有一个 TimeTrigger,它每分钟在数据库中执行一次简单的选择(甚至没有远程 CPU 密集型,但它可能会影响性能)。
我在高级计划、消费计划和应用服务计划中尝试过功能应用,无论计划有多大,它似乎在 10 分钟内更新了 130 次。
【问题讨论】:
-
您更新的是什么类型的数据库? (SQL Server、Cosmos DB、.. ?)
-
@PrebenHuybrechts 这是一个简单的 MSSQL 数据库,非常轻量级,到目前为止几乎没有任何数据。该项目正在开发中。
-
您在使用 SQL 数据库吗? (SQL Server PaaS) ?您为其分配了多少个 DTU?
-
@ThiagoCustodio 不,我不是在使用 MSSQL 和实体框架。数据库操作实际上并没有任何区别,因为它们很少(每分钟一次)。我在数据库上使用尽可能低的 DTU。虽然需要时间的工作不是使用数据库操作,但它只是进行了大量的 API 调用。只有时间触发器每分钟执行一次 sql 数据库操作。
-
你错了。首先,您无法将本地性能与云端性能进行比较。只是为了到达您的数据库,它会通过多个跃点,这会增加执行该功能的预期时间。其次,DTU实际上会增加这个过程的性能。我100%肯定如果你增加你会得到更好的结果。另外,尝试编写更新语句而不是 EF 生成的语句。
标签: c# azure azure-functions azure-durable-functions