通过 Azure 函数批量插入 Table 存储

Batch insert to Table Storage via Azure function

我有一个以下 azure 存储队列触发器 azure 函数,它绑定到 azure table 用于输出。

[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; }
        }
    }
}

我正在寻找一种方法来从 poisonqueue 中读取 15 条消息,这不同于 myqueue(上述 azure 函数上的队列触发器)并将其批量插入到动态 table(tableXyz, tableAbc 等)基于队列消息中的几个条件。由于我们有不同的毒物队列,我们​​希望从多个毒物队列中获取消息(毒物队列的名称将在 myqueue 消息中提供)。这样做是为了避免每次我们有一个新的毒药队列时都启动新的 azure 函数。

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

还有比这更好的方法吗?

不幸的是,存储队列对此没有很好的解决方案。如果您希望它是动态的,那么实施您自己的客户端和 table 输出的想法可能是您的最佳选择。我建议更改的一件事是使用计时器触发器而不是队列触发器。如果您每次向有毒队列添加内容时都在触发器队列中放置一条消息,它会按原样工作,但如果不是定时器触发器,则可以确保及时处理有毒消息。

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

Bryan 是正确的,在您的函数中创建一个新的队列客户端并不是解决此问题的最佳方法。幸运的是,服务总线扩展确实 allow batching。不幸的是,文档还没有完全跟上。

只要让你的触发器接收一个数组:

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

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

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