微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过Azure功能批量插入表存储

如何解决通过Azure功能批量插入表存储

我有一个后续的azure存储队列触发azure函数,该函数绑定到azure表以进行输出

[FunctionName("TestFunction")]
public static async Task<IActionResult> Run(
    [QueueTrigger("myqueue",Connection = "connection")]string myQueueItem,[Table("TableXyzObject"),StorageAccount("connection")] IAsyncCollector<TableXyzObject> tableXyzObjectRecords)
{
            var tableAbcObject = new TableXyzObject();

            try
            {    
                tableAbcObject.PartitionKey = DateTime.UtcNow.ToString("MMddyyyy");
                tableAbcObject.RowKey = Guid.NewGuid();
                tableAbcObject.RandomString = myQueueItem;

                await tableXyzObjectRecords.AddAsync(tableAbcObject);
            }
            catch (Exception ex)
            {
            }
            
            return new OkObjectResult(tableAbcObject);
        }

        public class TableXyzObject : TableEntity
        {
            public string RandomString { get; set; }
        }
    }
}

我正在寻找一种方法来从有毒的队列中读取15条消息,该消息与myqueue(Azure函数上方的队列触发器)不同,并根据队列消息中的少数情况将其批量插入动态表(tableXyz,tableAbc等)中。由于我们有不同的毒物队列,因此我们想从多个毒物队列中提取消息(毒物队列的名称将在myqueue消息中提供)。这样做是为了避免每次有新的中毒队列时都产生新的天蓝色函数

以下是我的想法,
->我可能必须使用queueClient(创建一个方法)来获取15条队列消息-Azure.Storage.Queue包的ReceiveMessages(15)
->然后使用TableBatchOperation类进行批量插入(不能使用输出绑定)

有没有比这更好的方法了?

解决方法

不幸的是,存储队列对此没有很好的解决方案。如果您希望它是动态的,那么实现自己的客户端和表输出的想法可能是您的最佳选择。我建议更改的一件事是使用计时器触发器而不是队列触发器。如果您每次向毒物队列添加某些内容时都将消息放入触发器队列中,它将照常运行,但是如果不这样做,计时器触发器将确保及时处理中毒的消息。

原始答案(与服务总线队列不正确有关)

Bryan是对的,因为在函数中创建新的队列客户端并不是解决此问题的最佳方法。幸运的是,服务总线扩展名是allow batching。不幸的是,文档还没有赶上。

只需让您的触发器接收一个数组即可:

[QueueTrigger("myqueue",Connection = "connection")]string myQueueItem[]

您可以在host.json中设置max batch size

"extensions": {
  "serviceBus": {
    "batchOptions": {
      "maxMessageCount":  15
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。