异步函数有什么好处吗?

Are there benefits to an async function?

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

azure 函数的妙处在于它们会根据负载自动扩展。 "classic" 服务器上的 async/await 模式的一个很酷的事情是,您可以更好地利用核心,以便处理更多请求。

既然 azure 函数可以自动缩放,那么编写异步函数对我有什么好处吗?

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

如果您的 Function App 运行在 Classic SKU 上运行,那么您需要为 Always On 实例付费,因此很明显您想使用资源尽可能高效。

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

在动态计划中使用 Azure Functions 异步时,您仍然会受益。这是因为您的应用程序消耗的资源(尤其是线程)更少,因此效率更高,因此成本更低。我想到了一些例子:

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

Once the number of existing (busy) threads hits the "minimum" number of threads, the ThreadPool will throttle the rate at which is injects new threads to one thread per 500 milliseconds. This means that if your system gets a burst of work needing an IOCP thread, it will process that work very quickly. However, if the burst of work is more than the configured "Minimum" setting, there will be some delay in processing some of the work as the ThreadPool waits for one of two things to happen 1. An existing thread becomes free to process the work 2. No existing thread becomes free for 500ms, so a new thread is created.

  • 内存使用:更多的线程意味着更高的内存使用。今天你为内存使用的上限支付了固定的费用,但如果将来改变为基于实际消耗的内存,那么你将为这种不必要的内存开销支付更大的费用。

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