2016-04-13 10 views
5

いくつかの調査を行った後も、Azureテーブルストレージとの「接続」を維持するにはどうすればベストなのかまだ分かりません。 CloudTableClientまたはCloudTableのインスタンスを複数の要求に再利用する必要がありますか?トランザクションごとにCloudTableClientとCloudTableの新しいインスタンスを作成する

大量のトラフィックが多いパブリックなAPIの背後にあるテーブルストレージを使用しています。高い可用性とパフォーマンスが求められます。すべての照会はPOINT照会(パーティション・キーと行キーの両方が使用可能)であり、応答の支払いはサイズが小さく(1キロバイト未満)書き込みパフォーマンスは大きな問題ではありません。 APIの各リクエストは、いくつかのパーティションにわたって最大10ポイントのクエリを読み取ることができます。

私の読書から、私は次のことを理解している:

  • CloudTableClientはスレッドセーフではなく、すべての取引のために作成する必要があります。これは、継続的に再作成されたときのパフォーマンスを妨げないはずです。

  • したがって、トランザクションごとにインスタンスを作成する必要があります。

正しい前提はありますか?

私はこのようにすべてのリクエストに対してCloudTableClientCloudTableを再初期化しています。それは無駄だと感じています。

は、実装を参照してください:

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

を別にオブジェクトを作成するための通常のオーバーヘッドから、私はCloudTableClientCloudTableオブジェクトの複数のインスタンスを作成する際にすべての問題が表示されません。 (

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

は、しかし、私はあなたのコードでCloudTableを作成している方法で問題を参照してください:あなたは、単に次のことをやっているのであれば、私はあなたが賢明なパフォーマンスヒットを取得するつもりだとは思いませんTableメンバー)。基本的には、コードTableEntityStorageComponentから取得すると、ストレージアカウントにテーブルを作成しようとしています。

 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

はい。これはシステム全体の設定であり、一度だけ定義する必要があります。 –

関連する問題