2

与许多开发人员一样,我正在寻找一种将现有应用程序集成到 SQL Azure 联合的方法,而替换身份列(我的表的主键)是一个大问题。

由于许多原因,我不想将 GUID 用作我的主键(请不要打开关于 GUID 的辩论,这不是我的问题:我只是不想要 GUID,句号)。

因此,我需要构建一个密钥提供程序来替换标准 SQL 数据库的“身份”功能。我正在使用实体框架,所以我可以很容易地找到一个Id在插入之前设置值的地方(通过覆盖SaveChanges我的ObjectContext类的方法)。我只需要找到一个“不太复杂”的实现来获取当前的 ID,即“农场就绪”。

我已经阅读了这篇 SO 帖子:“分片数据库(Azure 联合数据库)的 ID 生成”和“来自 MSDN 杂志的在 Windows Azure 中同步多个节点”,但这个解决方案对我来说听起来有点复杂。

我正在考虑为每个 SQL 表创建(自动)一个 azure 队列,其中包含一个预加载的连续整数列表。当我想要一个 Id 值时,我只需要从队列中获取一条消息(它变得不可见并在途中被删除),这给了我当前可用的 Id。

关于“Windows Azure Queues”和“Windows Azure Service Bus Queues”之间的选择,我更喜欢“Windows Azure Queues”,因为Service Bus Queues 的“高”延迟。我不认为 Azure Queues 缺少“订购保证”是个问题。

您如何看待使用 Azure 队列提供 Id 值的想法?你有没有看到任何放弃这个想法的论据?在 SQL Azure 联合数据库中提供整数 id 是否有更好的想法,甚至是好的做法?谢谢。

编辑 :

阿斯塔科夫建议使用 SnowMaker。我终于完成了SnowMaker的一个分支,以与 Azure 存储库的 v2 完全兼容。

编辑 2

请注意,Azure SQL Federation 将于 2015 年 9 月停用,包括 Web 层和业务层,如此所述。但是这个问题对于自定义分片解决方案仍然有效。

4

3 回答 3

4

造雪机

虽然从未在生产中尝试过,但似乎相当合理和可靠。

更新

两件事:您可以安全地参考 Azure Storage Client 1.7.XX 和 Azure.Storage 2.X 以使 SnowMaker 工作。或者像您一样修复它以与 Storage 2 一起使用。

作为旁注,我个人认为身份并不能解决任何问题,它甚至引入了这样的问题(但我仍然使用它)。考虑到它赋予我们的权力和规模,不要认为缺乏身份是联邦的劣势。为了事情大,我们必须摆脱由数字自动生成的传统思维。

不幸的是,我还没有与联邦合作的实际项目经验,但我真的很想尝试一下。我知道有使用联合的大型应用程序部署并且可大规模扩展。

于 2012-12-07T12:02:45.810 回答
3

另一个选择是RustFlakes项目。它提供了一种在分布式系统中生成唯一的、连续的 ID 而不会相互冲突的方法。它们与 GUID(128 位)大小相同,但由于它们是连续的,因此不会导致您在使用 GUID 时遇到的所有页面拆分、索引和相关问题。

于 2012-12-10T14:48:23.790 回答
0

不确定这是否对您有用,因为它不是 C#,但我已使用 0.3.3 版本的 Nodejs Azure Storage SDK 将 Snowmaker 移植到 Nodejs。

您可以使用 npm 安装它:

npm install snowmaker

Github 存储库是https://github.com/johnhamm/node-snowmaker

于 2014-09-22T02:43:59.360 回答