插入100批后无法从表存储中找到实​​体

时间:2018-11-08 22:22:53

标签: azure azure-functions azure-table-storage azure-tablequery

问题: 当前,我们有两个天蓝色的使用计划功能,每个功能都接收服务总线队列消息作为输入。 第一个函数使用存储的proc调用SQL Azure,取回500k +记录,将这些记录以100为批次保存到Azure表存储中,每个批次具有唯一的分区键。完成后,它会为下一个函数创建一个新的队列消息,以读取批处理并对其进行处理。

当第二个功能未预热但仍需要预热时,一切正常。如果第二个函数正在内存中运行,并且收到队列消息, 我们对表存储进行分区键查找,有时似乎返回的数据为空

将批处理插入表存储的代码:

 foreach (var entry in partitionKeyGroupinng)
               {
                   var operation = new TableBatchOperation();
                   entry.ToList().ForEach(operation.Insert);

                   if (operation.Any())
                   {
                       await CloudTable.ExecuteBatchAsync(operation);
                   }
               }

这在所有功能引用的共享程序集中的异步任务功能内。

要从表存储中读取作为分区键查找的代码:

TableContinuationToken continuationToken = null;

        var query = BuildQuery(partitionKey);

        var allItems = new List<T>();
        do
        {
            var items = await CloudTable.ExecuteQuerySegmentedAsync(query, continuationToken);
            continuationToken = items.ContinuationToken;
            allItems.AddRange(items);
        } while (continuationToken != null);

        return allItems;

通过分区键调用该代码以进行查找的代码:

 var batchedNotifications = await _tableStorageOperations.GetByPartitionKeyAsync($"{trackingId.ToString()}_{batchNumber}");

我认为这与批处理仍在编写中并可供其他客户使用有关,但不知道是这样吗?用功能处理和最终的一致性来处理此问题的最佳方法是什么?

我在表客户端上禁用了以下内容:

  tableServicePoint.UseNagleAlgorithm = false;          
  tableServicePoint.Expect100Continue = false;
  tableServicePoint.ConnectionLimit = 300;

如果事件发生时我还在存储浏览器中查找相同的分区键,则可以看到该批处理,以便它返回值?我认为在批处理中使用EGT可以确保尽快将其写入并可用,因为异步任务WriteBatch方法在完成批处理之前不应该完成,但是,不知道返回多长时间表存储需要将其写入物理分区,然后使其可用。我还对所有服务总线队列消息进行了批处理,然后再发送它们,以增加第二个功能的延迟。

问题: 在使用服务总线队列从两个函数之间的表存储中访问这些记录时,如何处理这种延迟?

0 个答案:

没有答案