如何解决通过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 举报,一经查实,本站将立刻删除。