C# 跨多个区域的单一时间触发Azure函数

C# 跨多个区域的单一时间触发Azure函数,c#,azure,concurrency,azure-functions,azure-storage-blobs,C#,Azure,Concurrency,Azure Functions,Azure Storage Blobs,我在多个区域部署了一个时间触发的Azure函数,我希望在它们之间有单例行为。例如,如果这些地区是美国西部和中欧,我希望每次只运行其中一个。这能实现吗 正如前面所说的,TimeTrigger隐式地使用Singleton属性,以确保每个主机只运行一个函数实例,这样就涵盖了这个方面 为了在所有区域中具有相同的行为,我尝试使用具有以下参数的Singleton: [Singleton(Account = "myAccount", Mode = SingletonMode.Listener)] 我通过复制

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

正如前面所说的,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类的元数据中找到有关
帐户
属性的更多信息,即
获取应该在其中创建blob租约的Azure存储帐户的名称。我不知道函数如何知道如何连接到存储以及在何处配置连接。

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

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

更新:


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

您的应用程序的所有副本都需要使用相同的存储帐户
-这将为每个区域创建一个实例?meI部署的两个功能应用程序在服务计划中工作,并在
AzureWebJobsStorage
设置中使用相同的存储帐户,但这两个应用程序同时被触发和执行,这是没有意义的。我在Singleton属性中使用不同的参数对它进行了测试,但没有测试(因为它应该由TimeTrigger自动实现),结果相同。我想现在唯一的解决方案是只部署函数应用的一个副本。@blob租约路径的MauriR部分包括唯一的函数app HostId,默认情况下,它对于每个函数应用都是唯一的。这可能就是为什么即使您使用同一个存储帐户,两个计时器都会启动。如果查看存储帐户,您可能会看到两个不同的侦听器锁(请参阅)。删除显式的SingletonAttribute注释,并确保两个应用程序使用相同的HostId,并且该注释可以正常工作。@MauriR在Functions v2中,您可以通过应用程序设置
AzureFunctionsHost:HostId
指定HostId。对于函数v1,您可以通过
hostId
属性在host.json中指定ID。@mathewc谢谢。我可以通过指定主机id来确认函数是否相互排除。但是,当我设置主机id时,会发出警告,并显示此消息。此互斥在本地和已部署的功能中起作用。