2016-10-02 56 views
6

Azure函数允许我编写在特定条件下执行的C#/ F#(以及更多)函数。这些函数可以是异步的(通过返回一个Task)。异步功能有什么好处吗?

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

由于azure函数自动缩放,对于编写异步函数有没有什么好处?

+2

您的问题是缺乏细节。 Azure的“云扩展”与C#的“异步”功能完全无关。 – Dai

+0

Azure函数运行任意C#/ F#函数,这些函数可以是异步或同步的。此选项是否可用,以便我可以在“顶级”功能中使用“await”,还是还有其他好处? –

回答

7

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

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

当在动态SKU中运行时,我认为您的问题是,如果我们只根据需要扩展功能,那么谁在乎他们是否有效地使用资源?我仍然会说,最好让你编写你的函数,让它们尽可能高效地运行。这样,当真正需要时,我们只能将您扩展出来,并且在我们旋转它们时最小化新实例的冷启动时间。

5

当您在动态计划中对Azure函数使用异步时,您仍然受益匪浅。这是因为你的应用消耗更少的资源(特别是线程),使其更加高效,因此成本更低。一些例子浮现在脑海:

  • 上下文切换:当运行高并发工作负载,你最终会分配给你的函数应用程序实例线程的数量较多。这大量的线程将导致昂贵的上下文切换,这会增加功能执行的延迟并因此可能增加您的账单。
  • 线程池增长:如果您有很多线程并需要添加更多线程,由于CLR如何抑制线程池的增长,这可能会给函数执行增加额外的延迟。乔恩·科尔有这个here的一个很好的说明:

一旦现有的(忙)的线程数命中线程的“最低”号,线程池将油门在这是速度注入新的线程每500毫秒一个线程。这意味着如果你的系统需要一个IOCP线程的工作,它会很快处理这个工作。但是,如果突发工作超过配置的“最小”设置,则在处理某些工作时会有一些延迟,因为ThreadPool会等待发生以下两件事之一:1.现有线程可以自由处理工作2.现有的线程在500毫秒内没有空闲,所以创建了一个新的线程。

  • 内存使用:多个线程意味着更高的内存使用情况。今天,你为内存使用量的上限支付一笔固定的金额,但如果这种变化将来基于实际消耗的内存而变化,那么你将为这种不必要的内存开销付出更多的金钱。

如果它不是很多工作,我强烈建议您利用函数中的异步模式。除了上面提到的原因外,最好不要对平台的容量或动态规模逻辑的效率做太多假设,因为不准确的假设可能最终导致成本增加。 :)