Azure 函数当时仅最大并发
Posted
技术标签:
【中文标题】Azure 函数当时仅最大并发【英文标题】:Azure functions only max concurrent at the time 【发布时间】: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/…
【参考方案1】:
可以在这里找到答案:Add Singleton support for Functions to ensure only one function running at a time
-
如果您正在使用消费计划:为确保不会横向扩展至多个实例,请设置此应用设置:
WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
= 1
要在此实例中只允许 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/…。我刚刚创建了一个支持案例来澄清这一点。以上是关于Azure 函数当时仅最大并发的主要内容,如果未能解决你的问题,请参考以下文章