【发布时间】:2019-06-03 00:12:05
【问题描述】:
我设置了一个 Azure 服务总线队列。在 host.json 文件中,我将 maxConcurrentCalls 设置为 1,但是当我在本地调试应用程序时,有 8-10 个工作线程正在运行,这使得应用程序无法调试。当我在本地调试我的应用程序时,如何只运行 1 个线程?
最初我的 host.json 是空的,我发现下面的代码应该只有 1 个线程执行参见https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus#host-json
{
"version": "2.0",
"extensions": {
"serviceBus": {
"prefetchCount": 100,
"messageHandlerOptions": {
"autoComplete": false,
"maxConcurrentCalls": 1,
"maxAutoRenewDuration": "00:55:00"
}
}
}
}
我将 host.json 设置添加到我的 local.json 设置中无济于事,我仍然有 10 个工作线程在启动时启动。 我还试图使函数调用单例看到 Make Azure Function run sequential on ServiceBusTrigger - maxConcurrentCalls not working 但是,这只是完全锁定了功能,根本没有解决任何问题。
[FunctionName("ReadFromXCagoIssueQueueAndRetrieveFiles")]
public static void Run([ServiceBusTrigger(QueueName, AccessRights.Manage, Connection = "SBConnection")]BrokeredMessage myQueueItem, TextWriter log)
{
log.WriteLine($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
var propIssueId = myQueueItem.Properties["IssueId"].ToString();
var issueId = int.Parse(propIssueId);
log.WriteLine($"begin grab files for issue: {issueId}");
retrieveIssueEPub(issueId);
}
retrieveIssueEPub 的执行是在多个工作线程上执行的,这意味着消息在函数运行 1 次后最终进入死信队列,因为它将相同的消息拆分到所有线程而不是我期望的 1 个线程最大并发呼叫。我错过了什么吗?一次同时拉出 1 条消息和在多个线程上执行函数有区别吗?
【问题讨论】:
-
Service Bus 应用程序应该同时提供多个消息。与此相关的任何 Web 应用程序也是如此。这并不会使它们更难调试。多个工作人员不会收到相同的消息,除非接收代码有问题。您在此处发布的代码有问题 - 它不会调用 BrokeredMessage.Complete(),因此一旦租约到期,消息就会再次出现在队列中。只需致电
Complete() -
我不知道你的代码应该做什么。我所知道的是,当您收到一条消息时,您必须通过调用
Complete()明确说明它已收到,否则假定您的工作人员失败并且消息将重新出现在队列中。这与使用数据库事务并忘记调用COMMIT没有什么不同。这就是所有队列系统的工作方式,除了 AWS 使用的分布式队列,Google Azure 不会锁定消息,它们将消息隐藏指定的时间。 -
我已将 host.json 更改为具有自动完成功能,但这并没有改变达到锁定且未刷新的问题。因此,如果消息自动完成,我仍然会出现多个线程?
-
我明白了,谢谢你的帮助
标签: c# multithreading azure