【问题标题】:How to configure for singleton - Queue Triggered Azure Function如何为单例配置 - 队列触发 Azure 函数
【发布时间】:2022-01-16 16:33:28
【问题描述】:

我想要一个从 Azure 存储帐户队列触发的 azure 函数作为单例运行。

函数应用在进程中,net6:

    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>

我的函数目前看起来如下:

[FunctionName(nameof(QueueTrigger))]    
[Singleton(Mode = SingletonMode.Listener)]
public async Task QueueBatch([QueueTrigger("TriggerSurvey")] TriggerMsg triggerMsg)

按照@Moho 的建议,我在host.json 和Singleton 方法装饰器中添加了以下内容,如上所示,但这对应用程序的行为没有影响。

"extensions": {
    "queues": {
      "maxPollingInterval": "00:00:02",
      "visibilityTimeout": "00:00:30",
      "batchSize": 1,
      "maxDequeueCount": 5,
      "newBatchThreshold": 8,
      "messageEncoding": "base64"
    }
  }

我测试如下: 我向队列发布了一条消息。该函数消耗了它并开始了它的工作 - 写入 Azure Sql。这项工作花费了大约 3 分钟,它在工作时多次插入了一个日志表,以及函数实例的相关 ID。发布第一条消息几秒钟后,我发布了第二条消息。从日志表中,我可以看到一个不同的函数实例已经消耗并与第一个函数实例同时处理。

有谁知道如何配置以便只有一个函数实例会轮询队列?

【问题讨论】:

  • 您能否检查您的函数在处理第一条消息期间是否有任何错误?
  • 没有错误,成功完成
  • 我认为这是基于您的代码的特定场景,作业完成后表中有多少相关ID?

标签: c# azure-functions


【解决方案1】:

批量大小和获取新批次的阈值是 在 host.json 文件中配置。如果你想最小化并行 在函数应用中执行队列触发的函数,您可以设置 批量大小为 1。此设置仅在很长时间内消除并发 因为您的函数应用在单个虚拟机 (VM) 上运行。

host.json > extensions > queues > batchSize

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue-trigger?tabs=csharp

【讨论】:

  • 感谢您的回答。我认为您的建议与函数上的 [Singleton(Mode = SingletonMode.Listener)] 属性相结合应该可以工作docs.microsoft.com/en-us/azure/app-service/…
  • 恐怕这不起作用 - 请查看有问题的编辑
  • @RobBowman 您目睹了什么行为让您相信 Microsoft 记录的设置和 SingletonAttribute 不起作用?具体来说,您想要完成什么?
  • 请参阅问题的补充。我现在通过在 Azure Sql DB 中设置“正在处理”标志来解决这个问题。所以现在这个函数做的第一件事就是检查标志的状态,只有在 false 时才会继续。
  • 今天回到这里并替换了 host.json 的条目 - 然后它开始工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2021-10-30
  • 2021-03-01
  • 2018-03-29
  • 1970-01-01
  • 2018-03-26
相关资源
最近更新 更多