0

我正在为 Windows Azure 开发一个 ASP.NET 应用程序。我们认为有必要对数据库使用分片来改善写入时间,因为应用程序的写入量很大,但数据很容易隔离。但是,我需要跟踪所有实例中的一些中心变量,并且我不确定存储该信息的最佳位置。我有哪些选择?

要求:

  • 必须是持久的,可以在实例重启后存活
  • 必须同步。避免冲突更新或至少在这种情况下抛出异常,而不是覆盖值或静默失败,这一点非常重要。
  • 必须相当快(每秒 2000 次以上读/写

我曾考虑编写一个单独的组件以在工作角色上运行,该角色只需读取/写入内存中的值并经常将它们刷新到磁盘,但我认为必须为此目的已经编写了一些我可以在 Windows 中使用的东西天蓝色。

我认为我正在寻找的是像 Apache ZooKeeper 这样的系统,但我不想在工作角色启动期间安装 JRE 和所有那些爵士乐。

编辑:根据下面的建议,我正在尝试使用以下代码使用 Azure 表存储:

var context = table.ServiceClient.GetTableServiceContext();
var item = context.CreateQuery<OfferDataItemTableEntity>(table.Name)
    .Where(x => x.PartitionKey == Name).FirstOrDefault();

if (item == null)
{
    item = new OfferDataItemTableEntity(Name);
    context.AddObject(table.Name, item);
}                    

if (item.Allocated < Quantity)
{
    allocated = ++item.Allocated;
    context.UpdateObject(item);
    context.SaveChanges();
    return true;
}

但是,context.UpdateObject(item)调用失败,并The context is not currently tracking the entity.没有查询项目的上下文最初将其添加到上下文跟踪机制吗?

4

3 回答 3

0

我最终得到了一个混合缓存/表存储解决方案。所有实例都通过 Azure 缓存跟踪变量,而第一个实例启动一个计时器,该计时器每秒一次将值保存到表存储中。启动时,如果可用,缓存变量会使用保存到表存储中的值进行初始化。

于 2012-11-09T15:43:30.317 回答
0

您是否研究过 SQL Azure 联合?这似乎正是您正在寻找的东西:SQL Azure 分片。

以下是一些阅读链接:

http://msdn.microsoft.com/en-us/library/windowsazure/hh597452.aspx

http://convective.wordpress.com/2012/03/05/introduction-to-sql-azure-federations/

http://searchcloudapplications.techtarget.com/tip/Tips-for-deploying-SQL-Azure-Federations

于 2012-11-08T04:36:09.457 回答
0

您需要的是表存储,因为它符合您的所有要求:

  • 耐用:是的,表存储是存储帐户的一部分,与特定的云服务或实例无关。
  • 同步:是的,表存储是存储帐户的一部分,与特定的云服务或实例无关。
    • 避免冲突更新非常重要:是的,这可以通过使用ETags
  • 相当快?非常快,每秒高达 20,000 个实体/消息/blob

更新:

下面是一些使用新存储 SDK (2.0) 的示例代码:

var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var table = storageAccount.CreateCloudTableClient()
                            .GetTableReference("Records");
table.CreateIfNotExists();

// Add item.
table.Execute(TableOperation.Insert(new MyEntity() { PartitionKey = "", RowKey ="123456", Customer = "Sandrino" }));

var user1record = table.Execute(TableOperation.Retrieve<MyEntity>("", "123456")).Result as MyEntity;
var user2record = table.Execute(TableOperation.Retrieve<MyEntity>("", "123456")).Result as MyEntity;

user1record.Customer = "Steve";
table.Execute(TableOperation.Replace(user1record));

user2record.Customer = "John";
table.Execute(TableOperation.Replace(user2record));
  1. 首先,它添加项目 123456。
  2. 然后我模拟 2 个用户获得相同的记录(想象他们都打开了一个显示记录的页面)。
  3. 用户 1 速度很快并更新了项目。这行得通。
  4. 用户 2 的窗口仍然打开。这意味着他正在研究该项目的旧版本。他更新旧项目并尝试保存它。这会导致以下异常(这是可能的,因为 SDK 与 ETag 匹配):

远程服务器返回错误:(412) Precondition Failed。

于 2012-11-08T07:17:03.743 回答