Azure functions 仅在当时最大并发
Azure functions only max concurrent at the time
我有一个处理 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"
}
}
}
正如您在下面的屏幕截图中看到的,我使用的是消费计划:
回答:
我得到以下工作:
"serviceBus": {
"maxConcurrentCalls": 3
}
可以在这里找到答案: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
}
}
}
我有一个处理 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"
}
}
}
正如您在下面的屏幕截图中看到的,我使用的是消费计划:
回答: 我得到以下工作:
"serviceBus": {
"maxConcurrentCalls": 3
}
可以在这里找到答案: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 } } }