Nhibernate 分布式字中的序列号

Nhibernate 分布式字中的序列号,nhibernate,distributed,sequences,Nhibernate,Distributed,Sequences,我们正在建立订单处理系统。我们有一个处理服务器集群。我们需要为订单分配可读的编号(例如ORD-000001、ORD-000002) 这是我们难以实现全系统锁定的主要问题。我正在考虑带锁过期的模式。但脑子里想的每件事都有瓶颈 我们正在接近DDD,所以直接访问数据库很困难。我们正在使用NHibernate。我们使用工作单元 请帮我提一些想法。每一个想法都是有价值的。有关于这个主题的阅读链接吗 更新: 我想强调的是,我需要序列号。因此不能使用高/低算法。在这个时候,我正在调查什么时候 我分配“可能好的

我们正在建立订单处理系统。我们有一个处理服务器集群。我们需要为订单分配可读的编号(例如ORD-000001、ORD-000002)

这是我们难以实现全系统锁定的主要问题。我正在考虑带锁过期的模式。但脑子里想的每件事都有瓶颈

我们正在接近DDD,所以直接访问数据库很困难。我们正在使用NHibernate。我们使用工作单元

请帮我提一些想法。每一个想法都是有价值的。有关于这个主题的阅读链接吗

更新: 我想强调的是,我需要序列号。因此不能使用高/低算法。在这个时候,我正在调查什么时候

  • 我分配“可能好的数字”
  • 推送到数据库
  • 如果失败,尝试分配另一个“可能很好的数字”
  • 如果成功,承诺
    但是我找不到适合的技术。

    您是否试图确保所有订单都有唯一的编号,但没有协调编号分布的中心位置

    这里有两个选项供您选择

  • 假设您期望在任何实际时间段内最多有10台服务器。让每个服务器分发ORD-XXXXX N格式的序列号。N是服务器的编号。因此,服务器0分发ORD-000000、ORD-000010、ORD-000020等。服务器6分发ORD-000006、ORD-000016、ORD-000026等

  • 分发数字块,每次10000。每个服务器在从后台某个地方运行的小服务器检索更多数据之前,都会使用一个块中的所有数字。小服务器只是一个接一个地运行所有的块,一次一个地传递它们。第一块要分发的是0-9999,第二块是10000-19999,第三块是20000-29999,以此类推


  • 以防万一,如果您真的使用单个数据库,为什么不能

    CREATE TABLE OrderNumbers (ID INT IDENTITY(1,1), Dummy VARCHAR(1))
    INSERT INTO OrderNumbers (Dummy) SELECT ''
    SELECT 'ORDER_N' + CONVERT(VARCHAR(50), @@IDENTITY) AS NewOrderNumber
    
    更新:即使您有不同的用户(多租户),如果您的序列号不必为+1,PK也会起作用-即您可以有1、4、10,而不仅仅是1、2、3

    更新:或者,正如jprete所建议的,执行以下操作:

    CREATE TABLE CustomerOrderNumber (ID INT, CustomerID INT)
    CREATE FUNCTION GetMaxId ( @mycustomerid INT ) RETURNS INT
    AS BEGIN
     DECLARE @maxid INT
     SET @maxid = SELECT ID FROM CustomerOrderNumber WHERE CustomerID = @mycustomerid
     SET @maxid = @maxid + 1
     UPDATE CustomerOrderNumber SET ID = @maxid
     RETURN @maxid
    END
    

    使用第二个你永远不知道何时会得到10台以上的服务器它真的解决了所有服务器之间的顺序号问题吗?S1做00,然后10,然后S2做06。。。行动,顺序不对。若我们可以使用“小型后台服务器”,为什么不直接将SQL表和自动递增的PK放在一起,或者放一个带有数字的共享文件。。。。不过,这是一个有趣的问题。不幸的是,我不能使用高/低算法。我需要序列号。此时,我正在研究如何使用中心位置减少往返和延迟。但我不喜欢中央位置的概念。我不知道数字的顺序性是如此重要。如果你想保证序列号,你需要一些东西,将他们分发到一个中央来源。否则,就无法确定你刚刚分发的号码没有被其他人使用。但是,如果拥有一个中心源不是问题,为什么不让数据库自动输入索引号或其他什么呢?拥有中心源意味着额外的往返。这也意味着瓶颈,因为我们必须锁定序列源。所以ProcessB将等待ProcessB完成。我考虑过使用MPI的想法(参见boost和C#实现),但不确定这是否有帮助。其中一个想法是,每个通信者都知道自己的级别(即,在分布式环境中出现的第n个级别)。不确定这是否有帮助,但我相信它被列为“一些”和“每个”想法;-)顺便问一句,您的服务器上有单个数据库还是多个数据库?如果它是单一的,为什么不能使用数据库的自动递增PK?(如果不能使用Orders表,请使用特殊OrdersPK表,插入行,并获取唯一的序列号)。如果它们是多个,如何测试“推送到数据库”失败?queen3,我不能使用PK,主要是因为我们使用多租户。我们使用同一个数据库为多个用户存储订单。用户必须有不同的顺序。难道你不能从给定客户的所有现有订单中获取最高的订单号,然后只添加一个吗?当你创建一个新的订单记录时,你就不能把它作为存储过程或者其他东西放在数据库上吗?我不是DB的人,只是在黑暗中摸索。最后一个解决方案,是我们现在正在使用的。我们不能容忍它,因为存在差距。我认为,如果我们没有更好的解决方案,我们将接受这样的解决方案,但是使用锁机制。我不明白,应该没有漏洞。您为每个客户逐个增加数字。当然,需要锁定。嗯,另一个解决方案是“每个客户一张桌子”——这是许多公司使用的,例如MS;-)-但我从不推荐它。无论如何,对于中央数据库服务器,这不是一个真正有趣的问题;-)