2016-04-13 2 views
5

После некоторых исследований я по-прежнему не уверен, как лучше всего поддерживать «соединение» с Azure Table Storage. Должно ли CloudTableClient или CloudTable экземпляров повторно использовать запросы?Создание новых экземпляров CloudTableClient и CloudTable за транзакцию

Мы используем хранилище таблиц за общедоступным API с высоким трафиком. Мы требуем высокой доступности и производительности. Все запросы - это запросы POINT (доступны как ключ раздела, так и строка строки), а ответный платеж небольшой по размеру (менее 1 килобайта). Производительность записи не является большой проблемой. Каждый запрос API мог читать до 10-ти точечных запросов по нескольким разделам.

Из моего чтения, я понял следующее:

  • CloudTableClient не поточно-и должны быть созданы для каждой сделки. По-видимому, это не должно мешать работе при непрерывном воссоздании.

  • A CloudTable экземпляр, таким образом, также должен быть создан для каждой транзакции.

Это правильные предположения?

Я, таким образом, повторно инициализирую CloudTableClient и CloudTable для каждого запроса. Это кажется расточительным.

реализация См:

public class EntityStorageComponent : IEntityComponent 
{ 
    private CloudStorageAccount storageAccount; 

    public CloudTable Table 
    { 
     get 
     { 
      var tableClient = storageAccount.CreateCloudTableClient(); 

      ServicePoint tableServicePoint = ServicePointManager.FindServicePoint(storageAccount.TableEndpoint); 
      tableServicePoint.UseNagleAlgorithm = false; 
      tableServicePoint.ConnectionLimit = 100; 

      var context = new OperationContext(); 
      context.Retrying += (sender, args) => 
      { 
       Debug.WriteLine("Retry policy activated"); 
      }; 

      // Attempt delays: ~200ms, ~200ms, ~200ms 
      var requestOptions = new TableRequestOptions 
      { 
       RetryPolicy = = new LinearRetry(TimeSpan.FromMilliseconds(200), 3), 
       MaximumExecutionTime = TimeSpan.FromSeconds(60) 
      }; 

      var table = tableClient.GetTableReference("farematrix"); 
      table.CreateIfNotExists(requestOptions, context); 

      return table;     
     } 
    } 

    public EntityStorageComponent(IOptions<ConfigurationOptions> options) 
    { 
     storageAccount = CloudStorageAccount.Parse(options.Value.TableStorageConnectionString); 
    } 

    public SomeEntity Find(Guid partitionKey, Guid rowKey) 
    { 
     var retrieveOperation = TableOperation.Retrieve<SomeEntity>(partitionKey, rowKey); 

     var retrievedResult = Table.Execute(retrieveOperation); 

     return retrievedResult.Result as SomeEntity; 
    } 
} 
+0

Не могли бы вы объяснить, что вы подразумеваете под «Я до сих пор не знаю, как лучше всего поддерживать соединение с Azure Table Storage.»? –

+1

@GauravMantri: По существу, следует ли повторять использование экземпляров «CloudTableClient» или «CloudTable» через запросы? Меня беспокоит неуважение к производительности, связанное с необходимостью воссоздавать их каждый раз, когда делается запрос (потенциально 1000 раз в минуту). – davenewza

ответ

6

Помимо обычного погона создания объекта, я не вижу никакой проблемы в создании нескольких экземпляров CloudTableClient и CloudTable объектов. Так что, если вы просто делаете следующее, я не думаю, что вы собираетесь получить удар по производительности мудрое:

 var tableClient = storageAccount.CreateCloudTableClient(); 
     var table = tableClient.GetTableReference("farematrix"); 

Однако я вижу проблему с тем, как вы создаете CloudTable в коде (Table участник). По существу в вашем коде, в любое время, когда вы получаете свойство Table от EntityStorageComponent, вы пытаетесь создать таблицу в своей учетной записи хранилища.

 var table = tableClient.GetTableReference("farematrix"); 
     table.CreateIfNotExists(requestOptions, context); 

Это проблема, потому что table.CreateIfNotExists(requestOptions, context); сделает сетевой вызов и замедлит вашу систему значительно. Вы можете переместить код table.CreateIfNotExists(requestOptions, context); и поместить его в свой код запуска, чтобы вы всегда были уверены (в основном), что таблица присутствует.

+0

Фантастический ответ. Спасибо – davenewza

+0

Быстрый вопрос: вы бы порекомендовали переместить поправки «ServicePoint» для запуска (Nagles и ConnectionLimit)? – davenewza

+1

Да, пожалуйста. Это системная настройка и ее следует определять только один раз. –

Смежные вопросы