【问题标题】:Batch insert to Table Storage via Azure function通过 Azure 函数批量插入表存储
【发布时间】:2021-01-09 02:51:31
【问题描述】:

我有一个以下 azure storage queue trigger azure function,它绑定到 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; }
        }
    }
}

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

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

还有比这更好的方法吗?

【问题讨论】:

  • 您正在使用 QueueTrigger,但随后想在排队的触发器函数中将 ReceiveMessages() 调用回同一个队列? Azure Functions 已经具有存储队列触发器的并发性(默认为 16 个进程)。使用 ReceiveMessages() 似乎没有意义。你可以解释吗?如果您出于某种原因不能使用输出绑定,那么使用 TableBatchOp 进行插入是有意义的。
  • 抱歉给您带来了困惑。此处的队列(myqueue)触发器与我要从中读取消息的队列不同。

标签: azure .net-core azure-functions azure-table-storage azure-queues


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 抱歉给您带来了困惑。对上述问题进行了编辑。 -------> 我正在寻找一种方法来从毒队列中读取 15 条消息,这与 myqueue 不同(触发上述函数)并根据以下几个条件将其批量插入动态表(tableXyz、tableAbc 等)队列消息。由于我们有不同的毒物队列,我们​​想从多个毒物队列中提取消息(毒物队列的名称将在 myqueue 消息中提供)。这样做是为了避免每次我们有一个新的毒物队列时都启动新的 azure 函数
  • 我想不出一种动态连接死信队列的方法——这是一对一的关系。但是,您可以创建一个单独的队列并使用“ForwardDeadLetteredMessagesTo”属性为您的函数创建一个集中的死信队列以供读取。该设置未在门户中公开,因此您需要使用 Service Bus Explorer 或 Azure CLI 之类的工具进行设置。
  • 感谢您的快速回复。几个问题,1. 允许批处理的服务总线扩展是否也支持 Azure 存储队列?我没有找到合适的文件。字符串数组 dint 也可以工作。 2. 另外,“ForwardDeadLetteredMessagesTo”属性是否可用于具有毒队列的 azure 存储队列?
  • 我 100% 错失了你使用的是存储队列而不是服务总线的事实(不知道我是怎么错过的——你在这一点上很清楚)。服务总线队列具有允许在函数内以活动级别进行自动重定向和批处理的属性。存储队列没有这些东西。我已经编辑了我的答案,以便正确服务(存储队列)的答案不会隐藏在 cmets 中。
猜你喜欢
  • 2019-03-16
  • 2021-11-26
  • 1970-01-01
  • 2014-10-27
  • 2011-05-02
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多