分布式字中的连续数字

时间:2009-09-21 19:58:47

标签: nhibernate distributed sequences

我们正在建立订单处理系统。我们有一组处理服务器。我们需要为订单分配可读数字(例如ORD-000001,ORD-000002)。

主要问题是我们很难实现系统范围的锁定。我正在考虑锁定到期的模式。但是所有想到的东西仍然存在瓶颈。

我们正在接近DDD,因此很难直接访问数据库。我们正在使用NHibernate。我们使用UnitOfWork。

请帮助一些想法。每个想法都很有价值。是否有关于主题的内容的链接?

更新: 我想强调,我需要序号。因此不能使用高/低算法。

此时我正在调查情景
  1. 我指定“可能是好数字”;
  2. 将其推送到数据库;
  3. 如果失败,请尝试分配另一个“可能是好数字”;
  4. 如果成功,请提交;
  5. 但我找不到goot技术。

2 个答案:

答案 0 :(得分:2)

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

以下是两个选项。

  1. 假设您希望在任何实际的时间段内最多拥有10台服务器。让每个服务器分发ORD-XXXXXN形式的序列号。 N是服务器的编号。所以服务器0分发ORD-000000,ORD-000010,ORD-000020等。服务器6分发ORD-000006,ORD-000016,ORD-000026等。

  2. 分发数字块,一次10000个。每个服务器都会使用块中的所有数字,然后从某个后台运行的小服务器中检索更多数字。小服务器一个接一个地遍历所有块,一次一个地传递出来。第一个发布的是0-9999,第二个是10000-19999,第三个是20000-29999等。

答案 1 :(得分:1)

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

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