Надежный и эффективный способ обработки пакетных обновлений Azure Table - PullRequest
1 голос
/ 22 февраля 2011

У меня есть IEnumerable, который я хотел бы добавить в таблицу Azure наиболее эффективным способом. Поскольку каждая пакетная запись должна быть направлена ​​на один и тот же ключ PartitionKey, с пределом 100 строк на запись ...

Кто-нибудь хочет предпринять попытку реализации этого «правильного» способа, как указано в разделе TODO? Я не уверен, почему MSFT не закончил задачу здесь ...

Также я не уверен, что обработка ошибок усложнит это, или правильный способ ее реализации. Вот код команды Microsoft Patterns and Practices для Windows Azure "Tailspin Toys", демонстрация

    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 Ответ

3 голосов
/ 23 февраля 2011

Ну, мы (команда шаблонов и практик) просто оптимизированы для показа других вещей, которые мы сочли полезными. Приведенный выше код на самом деле не «библиотека общего назначения», а скорее специфический метод для примера, который ее использует.

В тот момент мы думали, что добавление этой дополнительной обработки ошибок не добавит много, и мы решили не усложнять это, но ... мы могли ошибаться.

В любом случае, если вы перейдете по ссылке в // TODO:, вы найдете еще один раздел предыдущего руководства, которое мы написали, в котором немного больше говорится об обработке ошибок в «сложных» транзакциях хранения (не в «ACID»). хотя транзакции "ala DTC" не поддерживаются в Windows Azure Storage).

Ссылка это: http://msdn.microsoft.com/en-us/library/ff803365.aspx

Здесь более подробно перечислены ограничения:

  • В партии должен присутствовать только один экземпляр объекта
  • Макс. 100 объектов или 4 МБ полезной нагрузки
  • Тот же PartitionKey (который обрабатывается в коде: обратите внимание, что «пакет» указывается только при наличии единственного ключа раздела)
  • и т.д.

Добавление некоторой дополнительной обработки ошибок не должно слишком усложнять ситуацию, а зависит от типа приложения, которое вы создаете поверх этого, и вашего предпочтения обрабатывать это выше или ниже в вашем стеке приложений. В нашем примере приложение никогда не будет ожидать> 100 сущностей в любом случае, поэтому оно просто раздувает исключение в случае возникновения такой ситуации (потому что оно должно быть действительно исключительным). То же самое с общим размером. Варианты использования, реализованные в приложении, делают невозможным размещение одной и той же сущности в одной коллекции, поэтому, опять же, этого никогда не должно произойти (а если это произойдет, то просто выдаст)

Все ограничения "транзакций группы сущностей" описаны здесь: http://msdn.microsoft.com/en-us/library/dd894038.aspx

Дайте нам знать, как это происходит! Мне также интересно узнать, были ли другие части руководства полезными для вас.

...