我在多个区域部署了一个时间触发的 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/