Dav*_*New 12 azure azure-storage azure-table-storage
在做了一些研究之后,我仍然不确定如何最好地保持与Azure Table Storage的"连接".应该CloudTableClient或CloudTable实例跨请求被重用?
我们在公共的高流量API背后使用Table Storage.我们需要高读取可用性和性能.所有查询都是POINT查询(分区键和行键都可用),响应支付的大小很小(小于1千字节).写性能不是一个大问题.API上的每个请求都可以在几个分区中读取最多10个点查询.
从我的阅读中,我了解到以下内容:
CloudTableClient不是线程安全的,应该为每个事务创建.显然,这不应该在连续重建时妨碍性能.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Gau*_*tri 10
除了创建对象的通常开销之外,我在创建多个对象CloudTableClient和CloudTable对象时没有看到任何问题.因此,如果您只是执行以下操作,我认为您不会受到明显的打击:
var tableClient = storageAccount.CreateCloudTableClient();
var table = tableClient.GetTableReference("farematrix");
Run Code Online (Sandbox Code Playgroud)
但是,我确实看到了您CloudTable在代码(Table成员)中创建方式的问题.基本上在您的代码中,只要您从中获取该Table属性EntityStorageComponent,就会尝试在存储帐户中创建一个表.
var table = tableClient.GetTableReference("farematrix");
table.CreateIfNotExists(requestOptions, context);
Run Code Online (Sandbox Code Playgroud)
这是一个问题,因为它table.CreateIfNotExists(requestOptions, context);会进行网络呼叫,并会大大减慢您的系统速度.您可能希望移出table.CreateIfNotExists(requestOptions, context);代码并将其放入启动代码中,以便您(通常)确定该表存在.
| 归档时间: |
|
| 查看次数: |
2027 次 |
| 最近记录: |