2009-09-21 17 views
3

注文処理システムを構築しています。私たちには処理サーバのクラスタがあります。オーダーに読み取り可能な番号を割り当てる必要があります(例:ORD-000001、ORD-000002)。分布ワードの連続番号

システム全体のロックを実装するのが難しい主な問題です。私は、ロックの有効期限を持つスキーマについて考えています。しかし、すべてのことには依然としてボトルネックがあります。

DDDに近づいているため、データベースへの直接アクセスは困難です。私たちはNHibernateを使用しています。そして、UnitOfWorkを使用します。

Pls、いくつかのアイデアを参考にしてください。すべてのアイデアは貴重です。トピックで読むべきものへのリンクはありますか?

更新日: 私は連続番号が必要であることを強調したいと思います。したがって、ハイ/ローアルゴリズムは使用できません。現時点で私はシナリオを明らかにしています。

  1. 私は「おそらく良い数字」を割り当てます。
  2. データベースにプッシュします。
  3. 失敗した場合は、別の「おそらく良い数字」を割り当ててみてください。
  4. 成功した場合はコミットします。

しかし、私はgoot技術を見つけることができません。

+0

私はMPI(boostとC#の実装を参照してください)を使う考えは考えていますが、これが役立つかどうかは分かりません。そこにあるアイデアの1つは、各コミュニケータが独自のランク(分散envにN番目に表示されるランク)を認識していることです。これが役立つかどうかは分かりませんが、「いくつか」と「すべて」のアイデアにランクされます;-) – queen3

+1

ところで、サーバー全体で単一のデータベースか複数のサーバーがありますか?単一の場合、なぜデータベースの自動インクリメントされたPKを使用できないのですか?(Ordersテーブルを使用できない場合は、特別なOrdersPKテーブルを使用して行を挿入し、固有のシーケンシャル番号を取得してください)。それらが複数の場合、「データベースにプッシュする」テストでどのように失敗するのでしょうか? – queen3

+0

queen3、主にマルチテナントを使用しているため、私はPKを使用できません。同じデータベースを使用して、複数のユーザーの注文を格納します。そして、ユーザーは相違の順序を持​​つ必要があります。 –

答えて

2

すべての注文に固有の番号が付いているが、番号の分布を調整する中心的な場所がないことを確認しようとしていますか?

ここには2つのオプションがあります。

  1. 現実的な時間内に最大10台のサーバーが搭載されるとします。各サーバーにORD-XXXXXNという形式の連続番号を渡します。 Nはサーバーの番号です。サーバー0は、ORD-000000、ORD-000010、ORD-000020などを手渡す。サーバー6は、ORD-000006、ORD-000016、ORD-000026などを渡す。

  2. 数字のブロックを10000時間。各サーバーはブロック内のすべての数字を使い切ってから、バックグラウンドで実行されている小さなサーバーからより多くを取得します。小さなサーバーは、すべてのブロックを1つずつ実行し、一度に1つずつブロックを通過させます。配られる最初のブロックは、第二は10000から19999で、0-9999である第三は20000から29999である、など

+0

10台以上のサーバを使用する場合には分かりません。 – Mark

+1

すべてのサーバで連続番号の問題が本当に解決されていますか? S1は00、次に10、S2は06 ... opsを順不同に実行します。 「小さなバックグラウンドサーバ」を使用することができれば、自動増分されたPKを持つSQLテーブルや数字の付いた共有ファイルを置くのはいかがですか? – queen3

+0

残念ながら、hi/lowアルゴリズムは使用できません。私は連続番号が必要です。現時点では、中央の場所でラウンドトリップやレイテンシを減らす方法を検討しています。しかし、私は中央の位置の考えが嫌いです。 –

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 

UPDATE:あなたが別のユーザー(マルチテナント)を持っている場合でも、あなたのシーケンシャル数は1である必要はありません場合は、PKは動作します - あなたは1、4、10を持つことができ、すなわちありません唯一の1、2、3

UPDATE:または、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 
+0

最後の解決策は、現在使用しているソリューションです。ギャップのために、私たちはそれで生きていくことはできません。私たちがもっと良い解決策を持っていなければ、このようなもので生き残ることができると思いますが、ロック機構を持っています。 –

+0

私は理解していない、ギャップがないはずです。顧客ごとに番号を1つずつ増やします。もちろん、ロックが必要です。もう1つの解決策は「顧客ごとのテーブル」です。これは多くの企業で使用されています。 MS ;-) - しかし、私はそれを絶対に勧めません。とにかく、中央のDBサーバーでこれは本当に興味深い問題ではありません;-) – queen3

関連する問題