c# - 单例时间跨多个区域触发 Azure Function

标签 c# azure concurrency azure-functions azure-blob-storage

我在多个区域部署了一个时间触发的 Azure 函数,我希望在它们之间具有单例行为。例如,如果这些区域是美国西部和欧洲中部,我希望每次只运行其中一个区域。这可以实现吗?

作为documentation说,TimeTrigger 隐式使用 Singleton 属性来确保每个主机仅运行一个函数实例,从而涵盖了这一方面。

为了在所有区域具有相同的行为,我尝试使用具有以下参数的 Singleton:

[Singleton(Account = "myAccount", Mode = SingletonMode.Listener)]

我通过复制我的 C# 解决方案并运行这两个项目在本地进行了测试。显示以下错误:

The listener for function 'MyFunction' was unable to start. 
Microsoft.Azure.WebJobs.Host.Storage: Must replace singleton lease manager to 
support multiple accounts.

除了 Singleton 类的元数据外,我没有找到更多有关 Account 属性的信息,即 获取应在其中创建 blob 租约的 Azure 存储帐户的名称。我不知道该函数如何知道如何连接到存储以及在哪里配置连接。

最佳答案

我相信 [Singleton] 属性的 Account 属性指的是应用设置的名称,而不是实际存储帐户的名称。如果未指定,则采用 AzureWebJobsStorage 应用设置指定的存储帐户。您在此处引用的应用设置需要包含完整的存储连接字符串。

请注意,如果您想要跨区域单例行为,则应用程序的所有副本都需要使用相同的存储帐户(显然可以位于其他某个区域)。我预计会有一些与此相关的导出费用,但希望不足以产生太大影响。不过,需要注意一些事情。

更新:

关于您遇到的错误消息,事实证明 Functions 2.0 中的此功能实际上存在问题。最近打开了一个新的 GitHub 问题来跟踪该问题:https://github.com/Azure/azure-webjobs-sdk/issues/2214 。它还指出了一个临时解决方法,即您可以注册自己的 IDistributedLockManager 实现,如测试代码所示。

关于c# - 单例时间跨多个区域触发 Azure Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56383684/

相关文章:

c# - 使用 .NET Core 2 的 Azure WebJobs 失败并显示 "Invalid storage account"

java - 框架显示黑屏

c# - 为什么函数需要在定义或使用之前声明?

c# - .MakeArrayType() 和 .MakeArrayType(1) 的区别

azure - 从 GitHub 工作流管理 Azure 管道

java - 在java中解决死锁的替代方法

scala - 将尝试转换为 future 并恢复为 future

c# - 如何制作 System.Net.Mail MailMessage 的模型?

c# - 连接必须有效且打开才能保存到 MySql

c# - 在一条消息中将多个元素添加到 Azure 队列