0

好的,所以一个简单的任务(例如生成序列号)给我们带来了云中的问题。如果您拥有多个服务器,则越来越难以保证服务器之间分配的数量不会发生冲突。

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

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

我们仅限于使用:具有标识列的 SQL 表或服务器之间的某种点对点方法,或使用 blob 存储并利用锁来存储 nost 最新编号。(这可能有缩放问题)

我只是想知道有人有解决此问题的解决方案的想法吗?当然它是一个简单的问题,现在必须已经解决了。

4

3 回答 3

0

读完后我不会相信身份列。

我认为最好的方法是在插入之前,获取最后存储的 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

于 2013-11-21T11:15:39.403 回答
0

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

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

现在,您可以让您的代码首先轮询队列中的下一个数字,将其从队列中删除,然后尝试将其保存到 SQL Azure 数据库中。万一失败,您将拥有的只是序列号中的一个“漏洞”。在频繁插入的场景中,您可能会将无序的内容保存到数据库中(两个进程从队列中轮询,一个先轮询但最后保存,PK 保存到数据库中的顺序不再)

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

于 2013-11-21T17:29:07.643 回答
0

如果您担心在使用 blob 时扩展数字生成,那么您可以使用GitHubNuget上提供的SnowMaker库。它通过将 id 块检索到本地缓存中来解决规模问题。这保证了 Id 是唯一的,但如果您有多个服务器,则不一定是连续的。我不确定这是否会实现您的目标。

于 2013-12-17T21:45:38.347 回答