【发布时间】:2015-05-22 08:13:05
【问题描述】:
我需要将 Azure 表存储中表中的整个记录分区从 Partition1 移植到 Partition2。数千,甚至数百万。
我知道在 Azure 表存储中无法将实体从一个分区移植到另一个分区,您需要删除旧的并插入一个新的,并更新 PartitionKey,所以我的任务是做同样的事情许多记录。
有什么标准吗?
我想出了以下解决方案(简化):
public async Task Migrate(string oldPartition, string newPartition)
{
TableContinuationToken token = null;
List<Task> migrationTasks = new List<Task>();
do
{
TableQuerySegment<MyTableEntity> entries = await GetEntriesSegment(
oldPartition,
token);
token = entries.ContinuationToken;
migrationTasks.Add(MigrateEntries(entries, newPartition));
} while (token != null)
await Task.WhenAll(migrationTasks);
}
private async Task MigrateEntries(IEnumerable<MyTableEntity> entries, string newPartition)
{
await Task.WhenAll(
InsertInBatches(entries.Select(
e => GetEntryWithUpdatedPartitionKey(e, newPartition)),
DeleteInBatches(entries));
}
-
GetEntriesSegment封装了访问表并获取段的逻辑 -
GetEntryWithUpdatedPartitionKey只是将所有字段从一个MyTableEntity类型的对象复制到一个新创建的对象中,但使用不同的PartitionKey -
InsertInBatches负责将条目集合拆分为 100 个批次(Azure 表存储限制)并并行执行所有批次插入(通过另外一个await Task.WhenAll(insertTasks)内部) -
DeleteInBatches负责将条目集合拆分为 100 个批次(Azure 表存储限制)并并行执行所有批次删除(通过内部的另一个await Task.WhenAll(deleteTasks))
我的主要目标是并行处理所有内容。即,应在删除已读取的条目并插入新条目的同时读取新条目。
这个解决方案看起来合理吗?您知道任何经过时间证明(经过充分测试,用于生产项目)的替代方案吗?
【问题讨论】:
标签: .net async-await task-parallel-library azure-table-storage tpl-dataflow