云中的顺序编号

时间:2013-11-21 10:00:56

标签: azure cloud azure-storage sequential-number

好的,一个简单的任务,例如生成序列号,已经在云中引起了一个问题。 如果您有多台服务器,那么保证服务器之间分配的数量不会发生冲突就变得越来越难。

如果有帮助,我们正在使用Azure服务器。

我们考虑过使用应用缓存,但您不能保证它会在服务器之间更新。

我们仅限于使用: 带有标识列的SQL表 要么 服务器之间的一些对等方法 要么 使用blob存储并使用utalise锁来存储nost最新数字。 (这可能会出现缩放问题)

我只是想知道有没有人有解决这个问题的解决方案? 当然这是一个简单的问题,现在必须解决。

3 个答案:

答案 0 :(得分:0)

阅读this后,我不相信身份栏。

我认为最好的方法是在插入之前,获取最后存储的id并将其递增1。 (编程)。另一种选择是创建一个触发器,但如果您在DB上收到大量并发请求或者您的表有数百万条记录,那么它可能是一个质量。

create trigger trigger_name
on table_name
after insert
as 
declare @seq int
set @seq = (select max(id) + 1 from table_name)
update  table_name
    set  table_name.id =  @seq
    from  table_name 
    inner join inserted
    on  table_name.id = inserted.id

更多信息:

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

答案 1 :(得分:0)

如果你能忍受一个用例,有时你从这个中心位置获得的数字并不总是顺序的(但保证是唯一的)我建议考虑以下模式。我帮助一个大型的电子商务客户端实现这个,因为他们需要独特的int PK来同步回到前提:

创建一个队列并创建一个小的始终运行的进程,用顺序整数填充此队列(此进程应记住它最后生成的数字,并在队列接近为空时继续用更多数字补充池)

现在,您可以让代码首先轮询队列中的下一个数字,将其从队列中删除,然后尝试将其保存到SQL Azure数据库中。如果发生故障,您所拥有的只是序列号中的“漏洞”。在频繁插入的情况下,您可能无序地将数据保存到数据库中(两个进程从队列中轮询,一个先轮询,但最后保存,保存到数据库的PK不再是顺序的)

最大的缺点是你现在必须维护/监控一个补充PK池的过程。

答案 2 :(得分:0)

如果您担心在使用blob时缩放数字生成,那么您可以使用SnowMakerGitHub上提供的Nuget库。它通过将id块检索到本地缓存来解决规模问题。这可以保证Ids是唯一的,但如果您有多个服务器,则不一定是顺序的。我不确定这是否会实现您所追求的目标。