【问题标题】:Unable to limit the maximum number of concurrent service bus messages processed at a time无法限制一次处理的最大并发服务总线消息数
【发布时间】:2022-11-22 07:30:16
【问题描述】:

我正在使用 Azure Functions 3.0.13 并参考提供的文档

我有一个每天运行的 TimerTrigger,它将 0...N 条消息放在服务总线上,然后由一个带有 ServiceBusTrigger 的函数处理,该函数使用所述消息。

但是,使用提供的 host.json 输入,我可以看到无论将 maxConcurrentCalls 设置为 1,所有消息都会同时处理。

这导致所有函数并行运行并导致我的数据库出现死锁。

我可以使用装饰器 [Singleton(Mode = SingletonMode.Function)] 一次运行一个,但这会影响我的吞吐量,我宁愿能够控制一次可以并行处理多少条消息。

我是在误解文档还是这是一个错误?

主机.json

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true
      }
    }
  },
  "functionTimeout": "01:00:00",
  "extensions": {
    "serviceBus": {
      "prefetchCount": 1,
      "messageHandlerOptions": {
        "autoComplete": true,
        "maxConcurrentCalls": 1,
        "maxAutoRenewDuration": "00:05:00"
      },
      "batchOptions": {
        "maxMessageCount": 1,
        "operationTimeout": "00:05:00",
        "autoComplete": true
      }
    },
    "durableTask": {
      "maxConcurrentActivityFunctions": 5,
      "maxConcurrentOrchestratorFunctions": 1
    }
  }
}

编辑 1: 服务总线订阅上未启用会话,

【问题讨论】:

  • 该队列上是否启用了会话?
  • @david-ao,不,他们看不到带有附加照片的更新编辑

标签: azure-functions azureservicebus


【解决方案1】:

我认为这是限制一次处理的最大并发服务总线消息数的错误。 由于少数解决方法提供了以下信息:

  • maxConcurrentSessions 在 host.json 中设置为 1 有助于一次限制大约 20 消息。默认情况下,Functions 运行时会同时处理多条消息。
{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "prefetchCount": 100,
            "messageHandlerOptions": {
                "autoComplete": true,
                "maxConcurrentCalls": 1,
                "maxAutoRenewDuration": "00:05:00"
            },
            "sessionHandlerOptions": {
                "autoComplete": true,
                "messageWaitTimeout": "00:00:30",
                "maxAutoRenewDuration": "00:55:00",
                "maxConcurrentSessions": 1
            }
        }
    }
}

这里的prefetchCount值设置为100

预取消息增加队列或订阅的总吞吐量,因为它减少了消息操作或往返的总数。但是,获取第一条消息将花费更长的时间(因为消息大小增加了)。从缓存中接收预取消息会更快,因为这些消息已经被客户端下载。

参考:

  1. GitHub - azure-functions-host-issue
  2. Best Practices for performing improvements using ServiceBus Messaging
  3. Increase throughput rate for Azure Function App

【讨论】:

    【解决方案2】:

    我们在 Startup 上使用了一些自定义配置,这些配置有效地清除了 builder.Sources() 并在不知不觉中删除了 Azure Functions 将自动查找 host.json 文件的配置,因此我们的设置均未应用

    当我们从使用服务总线切换到 Durable Functions 并将 hubTaskName 设置为不同的东西时,这一点更加明显,这并没有在我们的环境中穿孔 - 棘手和自我诱导但需要寻找的东西!

    【讨论】:

      猜你喜欢
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 2018-10-19
      • 2020-07-20
      • 2017-11-01
      相关资源
      最近更新 更多