【问题标题】:Azure service bus Azure Function trigger and get all messagesAzure 服务总线 Azure Function 触发并获取所有消息
【发布时间】:2018-03-28 11:28:47
【问题描述】:

我有一个放入大量高频数据的队列。我有一个 azure 函数,该函数将在向其写入新消息时触发并将消息写入 Azure sql 数据库。我的问题是要写的消息太多,所以我想做的是一种“累积”消息,然后一次将它们全部写入数据库。我在 Azure 功能服务总线集成中看不到任何类型的功能来获取所有(或 x)消息并处理它们。

这样的事情可能吗?

感谢任何帮助。

【问题讨论】:

  • 您正在寻找批处理,目前不支持。有一个开放的 github 问题请求该功能:github.com/Azure/azure-webjobs-sdk/issues/1024
  • 另外,您可能永远不会看到“获取所有”的变化——由于 SB 将队列分区到多个队列实例的方式,Azure 本身永远不会准确地知道排队的“真实”消息数量用于交付(例如,当它从分区 #3 获取计数时,有人可以写入已经计数的分区 #1)。
  • 另外,以防万一你遇到它,SB queue Functions 相当混乱地将多个实例称为“批处理”......请参阅this 答案。

标签: c# azure azure-functions azureservicebus


【解决方案1】:

到目前为止,我解决此问题的方法是避免服务总线触发,因为它涉及该函数每条消息执行一个实例。我每 10 秒触发一次,并使用订阅客户端的 Receive 方法。

确实,在这种情况下,您需要手动引入 Azure 服务总线库,创建所需的类并调用 Receive 方法,该方法可以告诉您需要多少项目。请遵循最佳实践,将 ASB 类(TopicClient 和 SubscriptionClient)设置为单例,因为它们是昂贵的对象。

我还必须积累消息来对它们进行排序和去重,所以这就是我解决它的方法。但是,如果从 Azure Functions 扩展中获得这种开箱即用的功能会非常酷。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    我只是想知道您为什么需要批量插入。对于触发您的函数的每条消息,Azure 正在创建您的函数的一个新实例;所以性能在这里不会成为问题。 如果您仍想进行批处理,您可以将传入消息临时存储在代理 Azure 数据库/数据存储中,并在指定时间段内查询该代理并运行您的批处理插入命令。 请记住,批量插入成功后必须删除查询记录。

    【讨论】:

      【解决方案4】:

      Azure Functions 运行时分批检索和处理队列消息。默认batchSize为16,最大batchSize为32..这可以通过在Function App的host.json文件中提及batchSize来配置“队列”触发器。 Refer to know more on host.json

      “队列”触发器的配置设置

      "queues": {
        "maxPollingInterval": 2000,
        "visibilityTimeout" : "00:00:10",
        "batchSize": 16,
        "maxDequeueCount": 5,
        "newBatchThreshold": 8
      }
      

      【讨论】:

      • 这个答案是指存储队列,而不是服务总线队列。
      • 我正要说Yaaayyy,但后来我看到了这条评论。大声笑。
      猜你喜欢
      • 2017-04-22
      • 1970-01-01
      • 2022-08-05
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      相关资源
      最近更新 更多