【问题标题】:Azure Queue trigger - execute one message at the time not workingAzure 队列触发器 - 一次执行一条消息不起作用
【发布时间】:2018-09-02 02:47:09
【问题描述】:

我有一个与队列关联的 azure 队列触发器,我想确保触发器当时只读取和执行一条消息。因此,当消息被执行(成功与否)时,它会处理下一条消息。

发生的情况是队列执行了一条消息,但它开始执行另一条消息。我的 host.json:

"queues": {
    "maxPollingInterval": 20000,
    "visibilityTimeout": "00:01:00",
    "batchSize": 1,
    "maxDequeueCount": 5,
    "newBatchThreshold": 1
  }

按照 MS 链接的说明进行操作:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#trigger---configuration

如果您想避免并行执行接收到的消息 队列,你可以设置batchSize为1

因此预计一次只运行一条消息(我正在使用消费计划)。

这很关键,因为我需要确保它当时只处理一条消息。

我可以更改任何设置吗?

或者队列触发器不是解决此要求的好选择?

【问题讨论】:

    标签: azure azure-functions azure-queues


    【解决方案1】:

    对于遇到此问题并希望在本地调试并遇到多个队列项目问题的人,您可以将以下内容添加到您的 local.settings.json 以覆盖默认功能仅在您的计算机上

    {
      "IsEncrypted": false,
      "Values": {
         "AzureFunctionsJobHost__extensions__queues__batchSize": 1
       }
    }
    

    Documentation

    【讨论】:

      【解决方案2】:

      如果你想在函数应用中最小化队列触发函数的并行执行,你可以将批量大小设置为 1。但只有当你的函数应用在一个 上运行时,此设置才会消除并发单个虚拟机(VM)。

      如果您在每个 VM 上有多个虚拟机和函数实例,则每个虚拟机中运行的每个函数实例都会处理一条消息。

      Thismicrosoft 文档解释了触发器的并发性。

      【讨论】:

      • 知道这与持久功能有何关系,因为我有一个在应用服务计划中的单个实例上运行,并且按照文档的队列设置,它试图在它仍然存在时处理另一条队列消息处理上一条消息
      【解决方案3】:

      存储队列不保证排序 - 因此,如果由于交付顺序很重要而需要顺序处理,您需要考虑 Azure 服务总线并在功能设置 (host.json) 中进行设置

      maxConcurrentCalls = 1
      

      即使您通过设置函数应用可以扩展到以下的最大实例数来达到目的,Azure 存储队列仍然不能保证排序。

      WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT = 1
      

      Microsoft 文档并不完美。它正在不断更新。

      【讨论】:

      • 一次处理一条消息并不一定意味着按顺序处理。根据问题内容,​​我认为前者是要求,没有提到订购。所以这个答案是合适的。 @OP - 如果您需要订购,那么唯一的选择是 Service BusSession
      • @NikhilVartak 我相信他要求让 Azure Functions 一次处理每条消息。我从事了一些需要相同要求的项目。这是为了避免在函数将信息从消息添加到数据库时出现重复。
      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 2017-08-14
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      相关资源
      最近更新 更多