- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
经过一些研究后,我仍然不确定如何最好地保持与 Azure 表存储的“连接”。是否应该跨请求重用 CloudTableClient
或 CloudTable
实例?
我们在公共(public)高流量 API 后面使用表存储。我们需要高读取可用性和性能。所有查询都是 POINT 查询(分区键和行键都可用),并且响应支付大小较小(小于 1 KB)。写入性能并不是一个大问题。 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;
}
}
最佳答案
除了创建对象的常见开销之外,我没有发现创建 CloudTableClient
和 CloudTable
对象的多个实例有任何问题。因此,如果您只是执行以下操作,我认为您不会获得出色的性能:
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/
是否可以异步运行 ExecuteQuery? 考虑以下代码: public virtual MyEntity MyMethod(string parm1, string parm2) { s
我正在使用 Storage SDK 2.0 从不同线程(ASP.NET 应用程序)写入 Azure 表存储。 CloudTable对象线程安全吗?我可以仅初始化 CloudStorageAccount
我正在使用云表对象查询表存储,如下所示: private CloudTable _table _table.ExecuteQuery(query); 在抛出异常之前需要花费太多时间。我怎样
正如标题所示,我想知道我对表存储的所有请求是否应该共享对我的 CloudTable 的引用,我在任何地方都找不到涵盖此内容的文档。 示例 1(每个请求一个 CloudTable): public a
是否可以删除所有实体而不需要往返它们?如果这只能通过删除/恢复表来完成,那么应该使用什么方法来保存模式? 最佳答案 Is it possible to delete all entities with
表服务文档指出,一个实体最多可以有 252 个自定义属性(即列)。此限制是否适用于每个实体,还是对表中的所有唯一列强制执行? 用一个不切实际的例子来证明这一点:实体 A 可以将 A1 到 A252 和
在写入或查询表存储之前,我们调用一个方法来获取对 CloudTable 的引用。 private static CloudTable GetCloudTable() { var storageA
尝试批量插入 Azure 表存储时,我在 CloudTable.ExecuteBatch() 上收到 StorageException: TableBatchOperation batchOperat
经过一些研究后,我仍然不确定如何最好地保持与 Azure 表存储的“连接”。是否应该跨请求重用 CloudTableClient 或 CloudTable 实例? 我们在公共(public)高流量 A
就像用于 Azure 存储的 .NET SDK 一样,Java 版本也有 CloudTable用于针对特定 Azure 表执行操作的类。 虽然看起来 .NET 实现 isn't thread safe
我正在使用 Java 中的 Azure 表存储,遵循教程 here 。我成功地创建了一个表、添加了一个实体、检索了一个实体并删除了一个实体。但是,我有这个方法来删除表: public void del
所以我正在尝试测试 Azure 表存储并模拟我所依赖的东西。我的类的结构方式是在构造函数中建立连接,即我创建 CloudStorageAccount 的新实例。我在其中创建了 StorageCrede
我开始使用 Azure 和 c#,并尝试使用表存储 - 并使用 Azure 函数来更新表中的实体。我的代码如下: #r "Microsoft.WindowsAzure.Storage" #r "Ne
我正在努力寻找一些关于是否应该在 ASP.Net WebAPI 应用程序中共享 Azure 表存储对象集实例的真正指导。 为了完整起见,从表存储中检索实体如下所示。 当在数据层中集成类似的东西时,我在
我有用于删除某些项目的代码: private static void DeleteBatch(IList toDelete) { if(toDelete == null
我使用 WindowsAzure.Storage 9.1.1 nuget 包,当我运行时: var table = GetTableReference(vehicleStatusTableName);
我刚刚将一个函数从 MVC 应用程序移至 MVC API 应用程序,由于某种原因,除了 CloudTable.Execute 之外,它都可以工作。 代码: try {
我正在使用预编译的 Azure 函数,它看起来: public static async Task Run(Stream inputBlob, Stream outputJson, Stream ou
我正在尝试在 Visual Studio 2019 中运行 HTTP 触发的 v2 函数。它应该将其输出写入名为“history”的 Azure 存储表中。 我用它装饰了一个函数 [返回:表("历史记
当我在 PowerShell 中使用 AzureRm(版本 1.0.0.23)模块向 Azure 存储表添加行时,出现错误。在微软的文档中,存在“Execute”方法。下面是我用来添加行的代码。是否缺
我是一名优秀的程序员,十分优秀!