我们有一个Azure函数,该函数应该同时处理多个服务总线触发器,而我认为正在发生的事情是它被拆分到多个实例中,这最终会导致一些并发问题。
我们需要我们的功能充当单例,以便我们一次可以处理一个请求而不会发生任何冲突。根据我们在本文(https://docs.microsoft.com/en-us/azure/app-service/webjobs-sdk-how-to#singleton-attribute中所研究的内容),我们应该能够实现这一目标。
我们的功能如下:
[Microsoft.Azure.WebJobs.Singleton(Mode = SingletonMode.Listener)]
[FunctionName("AccountCreatedSubscriber")]
public static void Run([ServiceBusTrigger("accountscontacts-account-created", "license-keys", Connection = "FBISEventBus")]BrokeredMessage message, ILogger log)
{
log.LogInformation($"{{ Message received from accountscontacts-account-created topic }}");
// Do Work
log.LogInformation($"{{ Message sent to account creation handler }}");
}
为了进行备份,我们也将其保存在host.json文件中
{
"serviceBus": { "maxConcurrentCalls": 1 }
}
但是无论出于何种原因,我们的功能仍在并行运行。有什么想法吗?
答案 0 :(得分:2)
如果您的功能基于“消费计划”,请在Application settings中将WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
设置为1
。
在门户中检查您的Azure Function运行时版本(“平台功能”>“功能”应用程序设置)。如果是〜2,则需要如下修改host.json中的服务总线设置。
{
"version": "2.0",
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"maxConcurrentCalls": 1
}
}
}
}
答案 1 :(得分:0)
测试我得到以下工作:
此外,由于我们只有一个实例在运行(由于 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT = 1),运行的实例共享相同的静态变量。