【问题标题】:Singleton time triggered Azure Function across multiple regions跨多个区域的单例时间触发 Azure 函数
【发布时间】:2019-10-16 10:19:56
【问题描述】:

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

我没有找到更多关于 Account 属性的信息,而不是来自 Singleton 类的元数据,即 Gets the name of the Azure Storage account that the blob lease should be created in。我不知道该函数是如何知道如何连接到 Storage 以及在哪里配置连接的。

【问题讨论】:

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


    【解决方案1】:

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

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

    更新:

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

    【讨论】:

    • all copies of your app will need to use the same storage account - 这将为每个区域创建一个实例?对我来说没有意义
    • 我部署了两个在服务计划中工作的功能应用程序,并在AzureWebJobsStorage 设置中使用相同的存储帐户,但它们同时被触发和执行。我用 Singleton 属性中的不同参数测试了它,没有它(因为它应该由 TimeTrigger 自动实现),结果相同。我想现在唯一的解决方案是只部署一个 Function 应用程序的副本。
    • @MauriR Blob 租用路径的一部分包括唯一的 Function App HostId,默认情况下,每个 Function App 都是唯一的。可能这就是为什么即使您使用相同的存储帐户,两个计时器都在触发。如果您查看您的存储帐户,您可能会看到两个不同的侦听器锁(请参阅here)。删除您的显式 SingletonAttribute 注释,并确保您对两个应用程序使用相同的 HostId 并且它会起作用。
    • @MauriR 在 Functions v2 中,您可以通过应用设置 AzureFunctionsWebHost:hostId 指定 HostId。对于 Functions v1,您可以通过 hostId 属性在 host.json 中指定 ID。
    • @mathewc 谢谢。我可以通过指定主机 ID 来确认这些功能相互排斥。但是,当我设置主机 ID 时,此消息会引发警告 github.com/Azure/azure-functions-host/blob/… 这种互斥在本地和已部署的函数中有效。
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多