我有一个队列,其中放入了大量高频数据。我有一个azure函数,它会在新消息写入它时触发并将消息写入Azure sql数据库。我的问题是有太多的消息要写,所以我想做的就是"积累"消息然后将它们全部写入数据库。我没有在Azure功能服务总线集成中看到任何类型的功能来获取所有(或x)消息并处理它们。
这种情况有可能吗?
感谢任何帮助。
答案 0 :(得分:1)
到目前为止,我解决此问题的方法是避免服务总线触发,因为它涉及到该函数为每条消息执行一个实例。我每10秒触发一次时间,并且使用从订阅客户端接收方法。
实际上,在这种情况下,您需要手动引入Azure Service Bus库,创建所需的类,然后调用Receive方法,该方法可以告诉您想要多少个项目。请遵循将ASB类(TopicClient和SubscriptionClient)设置为单例的最佳实践,因为它们是昂贵的对象。
我还必须积累邮件来对它们进行排序和重复数据删除,因此这就是我解决的方法。但是,从Azure Functions扩展中立即使用这种功能非常酷。
答案 1 :(得分:0)
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
}
答案 2 :(得分:0)
从 Microsoft.Azure.WebJobs.Extensions.ServiceBus
的 4.1.0 版开始,确实支持批处理:https://github.com/Azure/azure-functions-servicebus-extension/issues/15#issuecomment-570682200
答案 3 :(得分:-1)
我只是想知道为什么需要批量插入。对于触发您的函数的每条消息,Azure都会创建一个新的函数实例;所以表现在这里不成问题。 如果您仍想进行批处理,则可以将传入的消息临时存储在代理Azure数据库/数据存储中,并在指定的时间段内查询该代理并运行批量插入命令。 请记住,成功批量插入后必须删除查询记录。