问题: 当前,我们有两个天蓝色的使用计划功能,每个功能都接收服务总线队列消息作为输入。 第一个函数使用存储的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方法在完成批处理之前不应该完成,但是,不知道返回多长时间表存储需要将其写入物理分区,然后使其可用。我还对所有服务总线队列消息进行了批处理,然后再发送它们,以增加第二个功能的延迟。
问题: 在使用服务总线队列从两个函数之间的表存储中访问这些记录时,如何处理这种延迟?