在Azure表存储中自动插入
-
18-09-2019 - |
题
我目前正在开发Azure表存储的应用程序。在该应用程序中,我的表格将相对较少(每天几千),这些实体的主要键将在另一个表中使用,该表将有数十亿行。
因此,我正在寻找一种使用自动插入整数而不是GUID作为小表中的主要键的方法(因为它可以节省大量的插入存储和可扩展性并不是真正的问题)。
关于该主题有一些讨论,例如 http://social.msdn.microsoft.com/forums/en/windowsazure/thread/6b7d1ece-301b-44f1-44f1-85ab-eeb-eeb274349797.
但是,由于并发问题确实很难进行调试和斑点,因此我自己实施此问题有些不舒服。因此,我的问题是对此有经过良好测试的推动吗?
解决方案
我尚未实施此功能,但正在努力...
您可以使用下一个ID播种队列,然后在需要时将其从队列中摘下。
您需要保留一个表格,以包含添加到队列中最大数字的值。如果您知道自己不会使用大量整数,那么您可能会有一个工人经常醒来,并确保队列中仍然有整数。您也可以有一个二手int队列,工人可以检查以密切关注使用情况。
您也可以将该工人挂钩,因此,如果您的代码需要ID(偶然)时,队列是空的,它可能会使工人的小睡中断以尽快创建更多键。
如果该电话失败了,您将需要一种方法来(告诉工人您将为他们做工作(锁定),然后做工人的工作,以获取下一个ID并解锁)
- 锁
- 从表中获取最后的键
- 增量并保存
- 开锁
然后使用新值。
其他提示
对于每个会在搜索中找到它的人,都有一个更好的解决方案。 桌锁的最小时间为15秒 - 那是糟糕的。如果要创建真正可扩展的解决方案,请不要使用它。利用 Etag
!
在表中创建一个实体以供ID(您甚至可以将其命名为ID或其他)。
1)阅读。
2)增量。
3)插入 和 ETag
指定(从读取查询)。
如果上次操作(InsertOrUpdate
)成功,然后您有了一个新的,独特的自动收入ID。如果失败(异常 HttpStatusCode
== 412),这意味着其他一些客户更改了它。因此,再次重复1,2和3。通常时间 Read+InsertOrUpdate
小于 200ms. 。我的测试实用程序 与github上的来源.
看 唯一的衍生器类 乔什·特威(Josh Twist)。
如果您确实需要避免GUID,请考虑使用基于日期/时间的某些内容,然后利用分区键来最大程度地降低并发风险。
您的分区密钥可以由用户,年,月,日,小时等组成,并且行键可以是足够小的时间段的日期时间,以控制并发。
当然,您必须以Azure的日期来问问自己,如果避免GUID确实值得所有这些额外的努力(假设GUID只能正常工作)。