处理Azure表批量更新的可靠而有效的方法

时间:2011-02-22 03:19:38

标签: linq azure ienumerable azure-storage

我有IEnumerable我希望以最有效的方式添加到Azure Table。由于每个批处理写入都必须指向同一个PartitionKey,每次写入限制为100行......

有没有人想要实施这个"对" TODO部分引用的方式?我不确定为什么MSFT在这里没有完成任务......

此外,我不确定错误处理是否会使这个问题复杂化,或者实现它的正确方法。以下是Windows Azure "Tailspin Toys" demo

的Microsoft模式和实践团队的代码
    public void Add(IEnumerable<T> objs)
    {
        // todo: Optimize: The Add method that takes an IEnumerable parameter should check the number of items in the batch and the size of the payload before calling the SaveChanges method with the SaveChangesOptions.Batch option. For more information about batches and Windows Azure table storage, see the section, "Transactions in aExpense," in Chapter 5, "Phase 2: Automating Deployment and Using Windows Azure Storage," of the book, Windows Azure Architecture Guide, Part 1: Moving Applications to the Cloud, available at http://msdn.microsoft.com/en-us/library/ff728592.aspx.

        TableServiceContext context = this.CreateContext();

        foreach (var obj in objs)
        {
            context.AddObject(this.tableName, obj);
        }

        var saveChangesOptions = SaveChangesOptions.None;
        if (objs.Distinct(new PartitionKeyComparer()).Count() == 1)
        {
            saveChangesOptions = SaveChangesOptions.Batch;
        }

        context.SaveChanges(saveChangesOptions);
    }


   private class PartitionKeyComparer : IEqualityComparer<TableServiceEntity>
    {
        public bool Equals(TableServiceEntity x, TableServiceEntity y)
        {
            return string.Compare(x.PartitionKey, y.PartitionKey, true, System.Globalization.CultureInfo.InvariantCulture) == 0;
        }

        public int GetHashCode(TableServiceEntity obj)
        {
            return obj.PartitionKey.GetHashCode();
        }
    }

1 个答案:

答案 0 :(得分:3)

嗯,我们(模式和实践团队)只是为了展示我们认为有用的其他东西而进行了优化。上面的代码实际上不是“通用库”,而是使用它的示例的特定方法。

在那一刻,我们认为添加额外的错误处理不会增加太多,我们喋喋不休地保持简单,但......我们可能错了。

无论如何,如果你按照// TODO:中的链接进行操作,你会发现我们编写的前一个指南的另一部分,它更多地讨论了“复杂”存储事务中的错误处理(不在“ACID”中)虽然Windows Azure存储中不支持事务“ala DTC”。

链接是这样的:http://msdn.microsoft.com/en-us/library/ff803365.aspx

这些限制更详细地列出:

  • 批次中只应存在一个实体实例
  • 最多100个实体或4 MB有效负载
  • 相同的PartitionKey(在代码中处理:注意只有在存在单个分区键时才指定“批处理”)

添加一些额外的错误处理不应该过多地复杂化,而是取决于您在此基础上构建的应用程序类型以及您在应用程序堆栈中处理此更高或更低的偏好。在我们的示例中,应用程序永远不会期望&gt;无论如何,它只有100个实体,所以如果发生这种情况,它会简单地将异常冒泡(因为它应该是非常特殊的)。与总大小相同。在应用程序中实现的用例使得在同一个集合中不可能拥有相同的实体,所以再次,这应该永远不会发生(如果它发生,它只会抛出)

此处记录了所有“实体组事务”限制:http://msdn.microsoft.com/en-us/library/dd894038.aspx

让我们知道它是怎么回事!我也有兴趣知道指南的其他部分是否对你有用。