我目前正在开发Azure表存储的应用程序。在该应用程序中,我的表格将相对较少(每天几千),这些实体的主要键将在另一个表中使用,该表将有数十亿行。

因此,我正在寻找一种使用自动插入整数而不是GUID作为小表中的主要键的方法(因为它可以节省大量的插入存储和可扩展性并不是真正的问题)。

关于该主题有一些讨论,例如 http://social.msdn.microsoft.com/forums/en/windowsazure/thread/6b7d1ece-301b-44f1-44f1-85ab-eeb-eeb274349797.

但是,由于并发问题确实很难进行调试和斑点,因此我自己实施此问题有些不舒服。因此,我的问题是对此有经过良好测试的推动吗?

有帮助吗?

解决方案

我尚未实施此功能,但正在努力...

您可以使用下一个ID播种队列,然后在需要时将其从队列中摘下。

您需要保留一个表格,以包含添加到队列中最大数字的值。如果您知道自己不会使用大量整数,那么您可能会有一个工人经常醒来,并确保队列中仍然有整数。您也可以有一个二手int队列,工人可以检查以密切关注使用情况。

您也可以将该工人挂钩,因此,如果您的代码需要ID(偶然)时,队列是空的,它可能会使工人的小睡中断以尽快创建更多键。

如果该电话失败了,您将需要一种方法来(告诉工人您将为他们做工作(锁定),然后做工人的工作,以获取下一个ID并解锁)

  1. 从表中获取最后的键
  2. 增量并保存
  3. 开锁

然后使用新值。

其他提示

对于每个会在搜索中找到它的人,都有一个更好的解决方案。 桌锁的最小时间为15秒 - 那是糟糕的。如果要创建真正可扩展的解决方案,请不要使用它。利用 Etag!

在表中创建一个实体以供ID(您甚至可以将其命名为ID或其他)。

1)阅读。

2)增量。

3)插入 ETag 指定(从读取查询)。

如果上次操作(InsertOrUpdate)成功,然后您有了一个新的,独特的自动收入ID。如果失败(异常 HttpStatusCode == 412),这意味着其他一些客户更改了它。因此,再次重复1,2和3。通常时间 Read+InsertOrUpdate 小于 200ms. 。我的测试实用程序 与github上的来源.

唯一的衍生器类 乔什·特威(Josh Twist)。

我发现的解决方案可以防止重复的ID,并让您自动插入它

  1. 锁(租赁)斑点 并让该充当逻辑大门。

  2. 然后读取值。

  3. 编写增量值

  4. 释放租约

  5. 在您的应用/表中使用该值

然后,如果您的工人角色在此过程中崩溃,那么您的商店中只会有一个丢失的ID。恕我直言,比重复项更好。

这里有一个 代码样本和更多信息 关于史蒂夫·马克思的这种方法

如果您确实需要避免GUID,请考虑使用基于日期/时间的某些内容,然后利用分区键来最大程度地降低并发风险。

您的分区密钥可以由用户,年,月,日,小时等组成,并且行键可以是足够小的时间段的日期时间,以控制并发。

当然,您必须以Azure的日期来问问自己,如果避免GUID确实值得所有这些额外的努力(假设GUID只能正常工作)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top