【问题标题】:Azure functions only max concurrent at the timeAzure 函数当时仅最大并发
【发布时间】:2019-05-17 07:27:07
【问题描述】:

我有一个处理 SharePoint 操作的 Azure 函数。由于节流,我只希望同时运行 10 个并发函数,并且始终同时运行 10 个函数。我正在考虑将函数与 Azure 服务总线队列一起使用。 Azure 平台中是否有任何构建来实现这一目标?服务总线不是必需的,因此如果其他集线器或队列对此更好。我查看了 Azure UI,并没有在服务总线端或功能上找到任何东西。

测试和观察:

我创建了一个没有成功的测试。我创建并部署了一个休眠 20 秒的函数,然后将文档写入 Cosmos DB:

[FunctionName("SleepFunction")]
public static void Run([ServiceBusTrigger("provision", AccessRights.Manage, Connection = "AzureWebJobsServiceBus")]string myQueueItem, TraceWriter log)
{
    System.Threading.Thread.Sleep(20000);
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");

    string EndpointUrl = "https://kk-db-governance-engine.documents.azure.com:443/";
    string PrimaryKey = "xx";
    var docClient = new DocumentClient(new Uri(EndpointUrl), PrimaryKey);
    var result = docClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri("kk-governance", "test-function-concurrency"), new Run());

}

功能 app.settings:

如果我将 10 条消息添加到队列中,则会同时将 10 个文档添加到数据库中。我希望在延迟 20 秒的情况下仅添加 3 个。在应用程序设置中设置 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 似乎不起作用。有什么建议?


我还尝试了 host.json 文件中的 maxConcurrentCalls:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsServiceBus": "xxx",
    "AzureWebJobsStorage": "xx",
    "AzureWebJobsDashboard": "xx"
  },
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "maxConcurrentCalls": "3"
    }
  }
} 

正如您在下面的屏幕截图中看到的,我使用的是消费计划:


回答: 我得到了以下工作:

“服务总线”:{ “最大并发呼叫数”:3
}

【问题讨论】:

  • 当您的意思是 10 个函数时,您的意思是您希望最多同时调用 10 个 SP ???
  • 是的。我有一个函数,我希望该函数的 10 个并发实例始终运行。因此,如果我向队列中添加 10000 条消息,则会有 10 个实例同时运行,直到处理完所有消息。
  • 根据这个帖子github.com/Azure/azure-functions-host/issues/…,您可以将此设置WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT设置为1。它将强制只运行一个函数应用实例。然后您可以在host.json file 中将最大并发调用更改为 10。我认为存储队列和服务总线队列都应该可以正常工作。
  • WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 应该是应用设置。只需将其放入门户的应用设置中
  • 另外,如果你想配置host.json文件,查看文档:docs.microsoft.com/en-us/azure/azure-functions/…

标签: c# azure azure-functions azure-servicebus-queues azure-webjobssdk


【解决方案1】:

可以在这里找到答案:Add Singleton support for Functions to ensure only one function running at a time

  1. 如果您正在使用消费计划:为确保不会横向扩展至多个实例,请设置此应用设置:
    • WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT = 1
  2. 要在此实例中只允许 X 个并发调用,您可以在 host.json 文件中指定此设置:

    { "version": "2.0", "extensions": { "serviceBus": { "maxConcurrentCalls": 1 } } }

【讨论】:

  • 谢谢@Thomas。我试过你的建议,没有运气。我在主帖中添加了发现。
  • 您是否尝试过两种设置:WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 设置为 1 和 maxConcurrentCalls 设置为 3?
  • Jeps, both and maxConcurrentCalls 并设置为 3。我认为这是产品中的一个问题,请参阅docs.microsoft.com/en-us/azure/azure-functions/…。我刚刚创建了一个支持案例来澄清这一点。
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多