【问题标题】:MaxConcurrentCalls = 0 yet still have worker threads when working locally with azure service busMaxConcurrentCalls = 0 但在本地使用 azure 服务总线时仍有工作线程
【发布时间】: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


【解决方案1】:

我的一位同事发现了错误。 应用程序一次只触发一个线程。然而,在天蓝色本身上,锁定持续时间设置为 30 秒。 这意味着应用程序将在 30 秒后启动新线程等,因为消息已解锁。 延长锁解决了这个问题。

【讨论】:

  • 掩盖了通过阻碍生产的问题。问题仍然存在,消息未及时处理,或者代码忘记在消息上调用Complete() 以将其从队列中删除。但是现在,您遇到了一个更大的问题,如果出现问题,消息将需要很长时间才能重试
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2023-02-14
  • 1970-01-01
  • 2021-01-10
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多