我正在使用Azure表存储,并试图找出提高性能的最佳方法.我执行的查询非常简单 - 使用分区键和行键的精确选择,或者带有列表的where子句(例如,WHERE x == 1或x == 2或x == 3等).一旦我收回数据,我就不会在数据上下文中跟踪它(不需要更改跟踪等).同样保存数据,因此我只将其添加到上下文以启用保存.
目前,我正在使用.NET库(存储客户端).由于我不使用更改跟踪和TableServiceContext的其他功能,我正在考虑直接使用HTTP API.有没有人尝试过两种选择?如果是这样,你看到了什么样的性能差异?
谢谢,埃里克
我有很多Azure类包含日期字段并通过跟踪进行修改.字段如:
[DisplayName("Created By")]
public string CreatedBy { get; set; }
[DisplayName("Modified By")]
public string ModifiedBy { get; set; }
Run Code Online (Sandbox Code Playgroud)
我想避免重复,所以我正在考虑创建一个类来包含这些如下:
public class TableServiceEntityRowInfo : TableServiceEntity
{
[DisplayName("Created By")]
public string CreatedBy { get; set; }
[DisplayName("Modified By")]
public string ModifiedBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
对于我的数据类,然后我不想让它们从TableServiceEntity继承,我想将它们设置如下:
public class MyClass : TableServiceEntityRowInfo
{
}
Run Code Online (Sandbox Code Playgroud)
这是向字段添加其他信息的有效且明智的方法.我在这里问的原因是因为我打算对很多课程这样做,我想确保我做正确的事.
我阅读了Azure Table/Blob/SQL存储之间的大量比较,我想我对所有这些都有很好的理解......但是,我仍然不确定在哪里可以满足我的特定需求.也许某人有类似情景的经验并能够提出建议.
是)我有的
一个SQL Azure数据库,用于在varchar(max)列中的原始HTML中存储文章.每行还有许多元数据列和许多索引,以便于查询.该表包含许多对用户,订阅,标签等的引用 - 因此我的项目将始终需要SQL DB.
有什么问题
我已经在这个表中有大约500,000篇文章,我预计它每年会增加数百万篇文章.每篇文章的HTML内容可以在几KB到1 MB之间,或者在极少数情况下,大于1 MB.
出现了两个问题:由于Azure SQL存储空间很昂贵,而且比以后更早,因此我将自己负责存储这个存储的成本.此外,我还会比以后更早地达到150 GB数据库大小限制.这500,000篇文章现在已占用1.6 GB的数据库空间.
我想要的是
很明显,那些HTML内容必须离开SQL DB.虽然文章表本身必须保留用于将其加入用户,订阅,标签等以便快速关联发现所需文章,但至少保存HTML内容的列可以外包到更便宜的存储.
乍一看,Azure Table存储看起来非常合适
非常便宜的价格和快速查询在一个大表中的数TB的数据 - 听起来很完美,有一个单独的表存储表将文章内容作为SQL DB的附加组件.
但是通过这里的比较显示它甚至可能不是一个选项:对于98%的文章,每列64 KB就足够了,但是对于某些单篇文章,即使整个1 MB的行限制也可能会留下2%还不够.
Blob存储听起来完全错误,但......
所以Azure上只有一个选项:Blob.现在,它可能没有听起来那么错误.在大多数情况下,我一次只需要一篇文章的内容.使用Blob存储时,这应该可以正常工作.
但我也有查询,我需要一次50行,100行甚至更多行,甚至包括内容.因此,我必须运行SQL查询来获取所需的文章,然后从Blob存储中提取每一篇文章.我对此没有任何经验,但我无法相信在执行此操作时我可以保持毫秒级的查询时间.对于我的项目而言,花费多秒的查询是绝对禁止的.
所以它似乎也不是一个合适的解决方案.
我看起来像个有计划的人吗?
至少我有类似计划的东西.我想过只将"适当的记录""导出"到SQL表存储和/或Blob存储中.
像"只要内容<64 KB将其导出到表存储,或者将其保存在SQL表中(甚至将此单个XL记录导出到BLOB存储中)"
这可能足够好了.但它使事情变得复杂,并且可能不容易出错.
那些其他选择
还有一些像MongoDB和CouchDB这样的其他NoSQL DB似乎更符合我的需求(至少从我天真的角度来看,那些刚读过纸上规格的人,我没有经验).但是他们需要自我托管,如果可能的话,有些事我想摆脱它.我在Azure上根据自托管服务器和服务的需要尽可能少地做.
你真的在这儿读过吗?
那么非常感谢你宝贵的时间和思考我的问题:)
任何建议将不胜感激.如你所见,我有自己的想法和计划,但没有什么能比以前走过路上的人有经验:)
谢谢,伯恩哈德
azure mongodb azure-storage-blobs azure-table-storage azure-sql-database
我多年来一直在使用 azure 表存储,但我不确定使用最新的 WindowsAzure.Storage 库版本 5.0.1-preview(用于新的 ASP.NET 5 应用):
问题: 给定一个分区键和行键,删除该行而不先检查是否存在,如果不存在则不会失败。
当前解决方案:此代码有效...但异常处理令人困惑:
public async Task DeleteRowAsync(CloudTable table, string partition, string row)
{
var entity = new DynamicTableEntity(partition, row);
entity.ETag = "*";
var op = TableOperation.Delete(entity);
try
{
await table.ExecuteAsync(op);
}
catch (Exception ex)
{
var result = RequestResult.TranslateFromExceptionMessage(ex.Message);
if (result == null || result.HttpStatusCode != 404)
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
异常本身将我指向这个 TranslateFromExceptionMessage 方法......我找不到关于它和 WrappedStorageException (抛出的异常的类型)的大量信息。这是检查存储异常中的 404 错误的某种新的/首选方法吗?有谁知道现在是否所有存储异常都会使用它,或者我是否需要编写代码来测试和弄清楚?
有一个 StorageException 类型的 InnerException。大概我们使用 StorageException.RequestInformation.HttpStatusCode 的旧代码可以以相同的方式访问这个内部异常。那是“OK”,还是以某种方式更好或更健壮地解析这些新的 XML 错误消息?
对于这种情况,我应该考虑完全不同的方法吗?
你好。
我Microsoft.WindowsAzure.Storage.StorageException在生产站点的日志中时不时地看到一条消息告诉我“服务器正忙”。有谁有关于如何摆脱这种行为的经验或专业提示。我是否应该更改 Azure 门户中的某些设置或对我的代码执行某些操作?
public static IEnumerable<MessageEntity> Get(string sentTo)当调用下面示例中的时,会发生错误。
代码:
private static CloudTable GetMessageTable()
{
var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
var tableClient = storageAccount.CreateCloudTableClient();
var table = tableClient.GetTableReference(CloudConfigurationManager.GetSetting("MessageTable"));
try
{
if (!table.Exists())
table.Create();
}
catch (Exception e)
{
// Log err
}
return table;
}
public static IEnumerable<MessageEntity> Get(string sentTo)
{
var table = GetMessageTable();
var query = new TableQuery<MessageEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, sentTo));
var result = table.ExecuteQuery(query);
return result.OrderByDescending(r => r.SentDate);
}
Run Code Online (Sandbox Code Playgroud)
日志: …
我正在尝试通过 python 访问 Azure 表存储。
按照这里的旧演练:https : //docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-python#install-the-azure-storage-sdk-for- Python
但是它专门为Azure 表引用的 Python SDK ( https://github.com/Azure/azure-storage-python ) 已被移动/弃用,以支持 Azure Cosmos DB SDK。
在弃用说明中,他们说要使用这个 SDK:https : //github.com/Azure/azure-cosmosdb-python
在该 SDK 的文档中,他们将您推荐给https://azure.microsoft.com/en-us/develop/python/
在该页面上的表存储和链接中,它会将您引回到第一个链接 (!!)
============
1) 我想要做的就是使用 Python SDK查询传统的Azure 表存储(不是 CosmosDB)
2) 理想情况下,Python SDK 还包括 Azure 表的加密/解密功能。
我错过了什么/那个python SDK是否仍然存在于任何地方?
注意: 我看到https://github.com/Azure/azure-cosmosdb-python/tree/master/azure-cosmosdb-table 但这个 SDK 似乎需要 CosmosDB 部署——它无法连接到传统的 AzureTables。我的理解不正确吗?
谢谢你的尽心帮助。
在https://github.com/Azure/azure-storage-net的 GitHub 页面上,它指出“从 9.4.0 开始,此库不支持表。”
有谁知道这个命名空间去哪里了?
我知道我参加这个聚会可能有点晚了,但仍然感到困惑。
多年来,我们一直在使用 NuGet 包WindowsAzure.Storage来处理 Blob、表和队列,在 .Net 的上下文中并使用 .Net Azure SDK。
在我们开发的许多 Azure Web 应用程序的最底层共享代码中,我们有一种缓存模式,CloudStorageAccount用于获取这些存储实体所需的各种客户端。我们使用以下 C# 代码获取该存储帐户:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
Run Code Online (Sandbox Code Playgroud)
这“storageAccount”缓存,我们用它在整个应用可以访问各种存储客户端,即CloudBlobClient,CloudTableClient和CloudQueueClient,就像这样:
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
Run Code Online (Sandbox Code Playgroud)
这些客户端也被缓存,但这可能与这个问题无关。
Microsoft 似乎鼓励(尽管可能没有任何弃用警告?)迁移到较新的 SDK,这些 SDK 位于Microsoft.Azure.Storage.Xxxxxx和/或中的 NuGet 包中Azure.Storage.Xxxxxxx,但这些 NuGet 包层次结构不支持表,仅支持 Blob 和队列(和文件,我目前没有使用)。
相反,表似乎处于不同的层次结构中,即Microsoft.Azure.Cosmos.Table.
但是CloudStorageAccount在 in 中Microsoft.Azure.Cosmos.Table声明的一个类型和在Microsoft.Azure.Storage.Common.
然后甚至更新的Azure.Storage.Xxxxxxxx库似乎对表没有任何支持。
当然,我可以为类型设置别名或始终完全指定它们,但这意味着我将不得不重写我的缓存代码(不是世界末日)但是整个练习的一部分让我怀疑我是否遗漏了一些这些各种不同存储实体的性质中的关键重要概念。我也很犹豫,因为我似乎可以打破一些第三方依赖。所以整个问题看起来真的很棘手。
我非常感谢任何概念上的理解、指向综合学习文档的指针、代码示例、建议或解释。表对我们来说很关键,但我怀疑我们是否会很快迁移到新的 Cosmos DB 表。
这是我的场景:
Microsoft.Azure.Storage.Blob 11.2.0
Microsoft.Azure.Storage.Queue 11.2.0
Micorosoft.Azure.Cosmos.Table 1.0.7
Run Code Online (Sandbox Code Playgroud)
我已经将很多代码从 Azure 函数转移到 Google k8s 和 Google Cloud,运行 Core .Net 应用程序,基本上使用 .net Standard 2.0 中内置的相同库,没有任何问题。
几天后,我注意到 Linux 系统中出现了不同的行为。与 Azure 服务(blob、表、队列)交互的调用很少会超时(子系统似乎失败了,我尝试了不同的重试策略,结果相同)。在 10,000 次调用中,我收到 10 到 50 个错误(或者在我更改超时之前很长的调用 180 秒)。这发生在所有 Azure 服务中:表、blob 和队列。
我尝试了不同的解决方案以找出原因:
在 azure 函数上运行相同的 dll 代码没有任何问题。
所以我得出的结论是,azure sdk 在内部使用的 http 客户端中有一些东西,这取决于您运行代码的操作系统。我想在几篇文章之后它可能是 Keep-Alive 标题,所以我尝试在我的组合根上:
ServicePointManager.SetTcpKeepAlive (true, 120000, 10000);
Run Code Online (Sandbox Code Playgroud)
但没有任何变化。
有什么想法或建议吗?...也许我走错了路,或者我错过了一些东西。
我正在从(现已过时的)NuGet 包迁移Microsoft.WindowsAzure.Storage.Table到,WindowsAzure.Storage我可以看到我的项目中正在使用Azure.Data.Tables某些地方。DynamicTableEntity
但DynamicTableEntity不存在于Azure.Data.TablesNuGet 包中,仅存在于TableEntity和ITableEntity.
TableEntity可用于:
Microsoft.WindowsAzure.Storage.Table.TableEntityMicrosoft.Azure.Cosmos.Table.TableEntityMicrosoft.Azure.CosmosDB.Table.TableEntity。Azure.Data.Tables.TableEntity.DynamicTableEntity可用于:
Microsoft.WindowsAzure.Storage.Table.DynamicTableEntityMicrosoft.Azure.Cosmos.Table.DynamicTableEntityMicrosoft.Azure.CosmosDB.Table.DynamicTableEntity。TableEntity和之间有区别吗DynamicTableEntity?
我阅读了文章,但仍然不明白其相关性: v12下Azure.Data.Tables没有类。DynamicTableEntityAzure.Data.Tables
是否有任何等效的类可以用于迁移?