Azure表存储上的自动增量

Yrl*_*lec 17 concurrency primary-key auto-increment identity-column azure-storage

我目前正在开发Azure表存储的应用程序.在该应用程序中,我有一个表,它将具有相对较少的插入(几千/天),并且这些实体的主键将在另一个表中使用,该表将具有数十亿行.

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

关于这个主题已经有过一些讨论,例如http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/6b7d1ece-301b-44f1-85ab-eeb274349797.

但是,由于并发问题可能很难调试和发现,我对自己实现这一点感到有点不舒服.因此,我的问题是,是否有一个经过充分测试的阻止?

cre*_*7or 15

对于每个都会在搜索中找到它的人来说,有一个更好的解决方案.桌锁的最短时间是15秒 - 这太可怕了.如果要创建真正可扩展的解决方案,请不要使用它.用Etag!

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

1)阅读它.

2)增量.

3)InsertOrUpdate WITH ETag指定(来自读取查询).

如果上一次操作(InsertOrUpdate)成功,那么您将拥有一个新的,唯一的,自动递增的ID.如果失败(HttpStatusCode== 412 除外),则表示其他客户端更改了它.所以,再次重复1,2和3.通常的时间Read+InsertOrUpdate不到200ms.我在github上使用source的测试实用程序.


Jas*_*ley 5

我还没有实现这个,但正在努力......

您可以将下一个要使用的 id 放入队列中,然后在需要时将它们从队列中取出。

您需要保留一个表来包含添加到队列中的最大数字的值。如果您知道不会使用大量整数,则可以让工作人员经常醒来并确保队列中仍然有整数。您还可以有一个已使用的 int 队列,工作人员可以检查以密切关注使用情况。

您还可以连接该工作人员,这样如果当您的代码需要一个 id(偶然)时队列为空,它可以中断该工作人员的午睡以尽快创建更多密钥。

如果该调用失败,您将需要一种方法(告诉工作人员您将为他们完成工作(锁定),然后让工作人员获取下一个 id 并解锁)

  1. 获取从表中创建的最后一个键
  2. 递增并保存
  3. 开锁

然后使用新值。

  • 如果只有 1 个woker 创建 id,则重复项将被放入队列中。当从队列中拉出id时,获取消息,然后在使用消息内容(id)之前删除该消息。这应该确保 id 不会被多次使用。看起来最糟糕的情况是你可能会丢失一把钥匙,但你的独特性应该仍然很好。 (2认同)

Pav*_*uva 5

请参阅Josh Twist的UniqueIdGenerator类.