gpt4 book ai didi

.net - Azure函数: Singleton for expensive object

转载 作者:行者123 更新时间:2023-12-02 14:30:35 29 4
gpt4 key购买 nike

我创建了一些非常简单的 Azure 函数。他们从 Couchbase(在 VM 上的 Azure 中运行)读取和写入数据。

我担心在 Azure Function 中与 Couchbase 建立的连接。我每次都会创建一个 Cluster 对象。这是一项昂贵的操作,我通常只会在普通的网络应用程序中执行一次。但在 Azure Function 中,我每次都会新建它。

除了 Couchbase 之外,实例化这样的对象还有很多昂贵的方法。有没有办法创建一个单例,或者某种 Azure Functions 可以在调用之间重用的共享对象?

最佳答案

在 Azure Functions 上处理单例时,有几个注意事项。一是全局状态在 AF 调用之间共享。因此,如果一个函数被调用一次,然后再次调用(很快主机还没有卸载您的代码),那么初始化只会发生一次。另一个考虑因素是 AF 可以完全自由地同时启动多个 AF 调用 - 因此任何单例都需要是线程安全的(包括它们的初始化)。

这意味着您需要使用 Lazy<T>/AsyncLazy<T> 。但是,请记住,AF(使用这些类型)将为您的下一次调用保留单例状态(初始化后),即使失败。这可能是一个问题,尤其是在云计算中,因为如果 AF 启动时出现网络(或配置)错误,您希望在下一次 AF 调用时重试初始化。

总之,您想使用Lazy<T>/AsyncLazy<T>以线程安全的方式并且不会保留失败。

Lazy<T> ,这意味着 you have to use the LazyThreadSafetyMode.PublicationOnly flag 将函数传递给构造函数(不仅仅是隐式使用 T 的默认构造函数)。请注意,这意味着您需要确保初始化函数本身是线程安全的,因为它可以由多个线程同时执行。

AsyncLazy<T> , you have to use the AsyncLazyFlags.RetryOnFailure flag 。自 AsyncLazy<T>本质上是 Lazy<Task<T>> ,异步初始化任务在所有同时调用者之间“共享”,然后自动替换为新的 Lazy<Task<T>>实例如果失败。所以异步初始化函数不需要是线程安全的。

由于正确地实现这一点(特别是对于多个单例)相当复制粘贴,因此我将其抽象为 the AF project I'm working on :

花了一段时间才达到这一点,但我对结果感到非常满意。也想写博客讨论这个问题...

关于.net - Azure函数: Singleton for expensive object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162151/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com