单例时间触发跨多个区域的Azure功能

时间:2019-05-30 18:24:06

标签: c# azure concurrency azure-functions azure-storage-blobs

我有一个时间触发的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属性的信息。我不知道该功能如何知道如何连接到存储以及在何处配置连接。

1 个答案:

答案 0 :(得分:1)

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

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

更新:

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