gpt4 book ai didi

azure - 每个事务创建 CloudTableClient 和 CloudTable 的新实例

转载 作者:行者123 更新时间:2023-12-04 01:03:44 24 4
gpt4 key购买 nike

经过一些研究后,我仍然不确定如何最好地保持与 Azure 表存储的“连接”。是否应该跨请求重用 CloudTableClientCloudTable 实例?

我们在公共(public)高流量 API 后面使用表存储。我们需要高读取可用性和性能。所有查询都是 POINT 查询(分区键和行键都可用),并且响应支付大小较小(小于 1 KB)。写入性能并不是一个大问题。 API 上的每个请求最多可以跨几个分区读取 10 个点查询。

通过阅读,我了解到以下内容:

  • CloudTableClient 不是线程安全的,应该为每个事务创建。显然,这不应该在连续重新创建时影响性能。

  • 因此还必须为每个事务创建一个 CloudTable 实例。

这些假设正确吗?

因此,我针对每个请求重新初始化 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;
}
}

最佳答案

除了创建对象的常见开销之外,我没有发现创建 CloudTableClientCloudTable 对象的多个实例有任何问题。因此,如果您只是执行以下操作,我认为您不会获得出色的性能:

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

但是,我确实发现您在代码(Table 成员)中创建 CloudTable 的方式存在问题。本质上,在您的代码中,每当您从 EntityStorageComponent 获取 Table 属性时,您都在尝试在存储帐户中创建一个表。

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

这是一个问题,因为 table.CreateIfNotExists(requestOptions, context); 将进行网络调用,并会显着降低系统速度。您可能需要移出 table.CreateIfNotExists(requestOptions, context); 代码并将其放入启动代码中,以便您始终(大部分)确定该表存在。

关于azure - 每个事务创建 CloudTableClient 和 CloudTable 的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36598183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com