异步功能有好处吗?

时间:2016-10-02 21:14:10

标签: azure-functions azure-function-async

Azure函数允许我编写在某些条件下执行的C#/ F#(和更多)函数。这些函数可以是异步的(通过返回任务)。

关于天蓝色功能的一个很酷的事情是它们会根据负载自动放大。关于"经典"的异步/等待模式的一个很酷的事情。服务器,您可以更好地利用核心,以便处理更多请求。

由于azure函数可以自动缩放,因此编写异步函数对我有什么好处吗?

2 个答案:

答案 0 :(得分:7)

您在Azure Functions中使用async的原因与在任何其他应用程序中使用的原因相同。对于阻止可能长时间运行的外部I / O的操作,它将更有效地使用资源。 Azure Functions完全支持运行时核心中的异步,因此如果使用正确,它将允许在单个Function App上实现更多并行性和更好的吞吐量,因为线程不会被阻塞等待I / O并且可用于处理更多请求/触发器

如果您的功能应用程序在经典SKU 上运行,那么您需要为Always On实例付费,因此很明显您希望尽可能高效地使用资源。

动态SKU 中运行时,我认为您的问题是,如果我们只是根据需要扩展您的功能,那么谁在乎他们是否有效地使用资源?我仍然会说你最好对你的功能进行编码,以便它们尽可能高效地运行。这样我们只会在真正需要时将您扩展出来,并在我们启动它们时尽量减少新实例的冷启动时间。

答案 1 :(得分:6)

在动态计划中使用Azure功能的异步时,您仍然会受益。这是因为您的应用程序消耗的资源更少(特别是线程),从而使其更高效,因此更便宜。想到一些例子:

  • 上下文切换:运行高度并发的工作负载时,最终会将大量线程分配给您的功能应用实例。这么多的线程会导致昂贵的上下文切换,这会增加功能执行的延迟,因此可能会增加您的账单。
  • 线程池增长:如果您有很多线程并且需要添加更多线程,这会因为CLR如何限制线程池的增长而为您的函数执行增加额外的延迟。 Jon Cole对此here
  • 有很好的描述
  

一旦现有(繁忙)线程的数量达到"最小值"线程数, ThreadPool将限制每500毫秒向一个线程注入新线程的速率。这意味着如果您的系统需要一个IOCP线程,那么它将非常快速地处理该工作。但是,如果突发工作超过配置的"最小值"设置,处理一些工作会有一些延迟,因为ThreadPool等待发生两件事之一1.现有线程可以自由处理工作2.没有现有线程500毫秒免费,所以新线程是创建

  • 内存使用:更多线程意味着更高的内存使用率。今天你为内存使用的上限支付固定金额,但如果将来根据实际消耗的内存而改变,那么你将为这种不必要的内存开销支付更多的钱。

如果不是很多工作,我强烈建议您在功能中利用异步模式。除了上面提到的原因之外,最好不要对平台的容量或动态规模逻辑的效率做出太多假设,因为不准确的假设最终可能会花费你更多的钱。 :)