好的,所以一个简单的任务(例如生成序列号)给我们带来了云中的问题。如果您拥有多个服务器,则越来越难以保证服务器之间分配的数量不会发生冲突。
如果有帮助,我们将使用 Azure 服务器。
我们考虑过使用应用缓存,但您不能保证它会在服务器之间更新。
我们仅限于使用:具有标识列的 SQL 表或服务器之间的某种点对点方法,或使用 blob 存储并利用锁来存储 nost 最新编号。(这可能有缩放问题)
我只是想知道有人有解决此问题的解决方案的想法吗?当然它是一个简单的问题,现在必须已经解决了。
好的,所以一个简单的任务(例如生成序列号)给我们带来了云中的问题。如果您拥有多个服务器,则越来越难以保证服务器之间分配的数量不会发生冲突。
如果有帮助,我们将使用 Azure 服务器。
我们考虑过使用应用缓存,但您不能保证它会在服务器之间更新。
我们仅限于使用:具有标识列的 SQL 表或服务器之间的某种点对点方法,或使用 blob 存储并利用锁来存储 nost 最新编号。(这可能有缩放问题)
我只是想知道有人有解决此问题的解决方案的想法吗?当然它是一个简单的问题,现在必须已经解决了。
读完后,我不会相信身份列。
我认为最好的方法是在插入之前,获取最后存储的 id 并将其加一。(以编程方式)。另一种选择是创建一个触发器,但如果您将在 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
如果您可以接受一个用例,有时您从该中心位置获得的数字并不总是连续的(但保证是唯一的),我建议考虑以下模式。我帮助一个大型电子商务客户实现了这一点,因为他们需要唯一的 int PK 来同步回前提:
创建一个队列并创建一个始终运行的小型进程,该进程使用连续整数填充此队列(此进程应记住它最后生成的数字,并在队列接近为空时继续用更多数字补充池)
现在,您可以让您的代码首先轮询队列中的下一个数字,将其从队列中删除,然后尝试将其保存到 SQL Azure 数据库中。万一失败,您将拥有的只是序列号中的一个“漏洞”。在频繁插入的场景中,您可能会将无序的内容保存到数据库中(两个进程从队列中轮询,一个先轮询但最后保存,PK 保存到数据库中的顺序不再)
最大的缺点是您现在必须维护/监控一个补充 PK 池的进程。