我有一个时间触发的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
)中,我没有找到关于Gets the name of the Azure Storage account that the blob lease should be created in
属性的信息。我不知道该功能如何知道如何连接到存储以及在何处配置连接。
答案 0 :(得分:1)
我相信Account
属性的[Singleton]
属性是指应用程序设置的名称,而不是存储帐户的名称。如果未指定,则假定使用AzureWebJobsStorage
应用设置指定的存储帐户。您在此处引用的应用设置将需要包含完整的存储连接字符串。
请注意,如果您想要跨区域单例行为,则应用程序的所有副本将需要使用相同的存储帐户(显然,该帐户可能位于其他区域)。我希望会有与此相关的出口费用,但希望不会产生太大影响。不过,有一些需要注意的地方。
更新:
关于遇到的错误消息,事实证明,Functions 2.0中此功能实际上存在问题。最近发布了一个新的GitHub问题,该问题跟踪该问题:https://github.com/Azure/azure-webjobs-sdk/issues/2214。它还指出了一个临时解决方法,即您可以注册自己的IDistributedLockManager
实现,如测试代码所示。