2009-09-21 3 views
3

Мы строим систему обработки заказов. У нас есть кластер серверов обработки. Нам нужно присвоить читаемые числа заказам (например, ORD-000001, ORD-000002).Последовательные номера в распределенном слове

Основная проблема в том, что для нас трудно реализовать системный замок. Я думаю о схемах с истечением срока блокировки. Но все имеет в виду все еще узкие места.

Мы приближаемся к DDD, поэтому прямой доступ к базе данных затруднен. Мы используем NHibernate. И мы используем UnitOfWork.

Pls, помощь с некоторыми идеями. Каждая идея будет ценной. Любые ссылки на что-то читать по теме?

ОБНОВЛЕНИЕ: Я хочу подчеркнуть, что мне нужны последовательные номера. И поэтому нельзя использовать алгоритмы hi/low. В настоящее время я рассматриваю сценарий, когда

  1. Я назначаю «вероятно, хорошее число»;
  2. Нажмите его в базу данных;
  3. Если ошибка, попробуйте назначить другое «вероятно, хорошее число»;
  4. Если успех, совершите;

Но я не могу найти технологию goot для этого.

+0

Я думаю об идее использования MPI (см. Реализацию boost и C#), но не уверен, что это поможет. Одна из идей заключается в том, что каждый коммуникатор знает свой собственный ранг (т. Е. Nth появляется в распределенном env). Не уверен, что это помогает, но я считаю, что он считается «некоторой» и «каждой» идеей ;-) – queen3

+1

Кстати, у вас есть одна база данных или многие на серверах? Если он один, почему нельзя использовать автоматическую учетную запись использования базы данных?(если вы не можете использовать таблицу ордеров, используйте специальную таблицу OrdersPK, вставьте строку и получите свой уникальный порядковый номер). Если они несколько, как вы тестируете «push to database» для отказа? – queen3

+0

queen3, я не могу использовать ПК, в основном потому, что мы используем несколько арендаторов. Мы используем одну и ту же базу данных для хранения заказов для нескольких пользователей. И пользователи должны иметь разностные последовательности. –

ответ

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 и т.д.

+0

Использовать второй, который вы никогда не знаете, когда вы получите более 10 серверов – Mark

+1

Реально ли это проблема последовательных чисел среди всех серверов? S1 делает 00, затем 10, затем S2 делает 06 ... ops, из последовательности. И если мы можем использовать «небольшой фоновый сервер», почему бы просто не разместить 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 - т.е. вы можете иметь 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 
+0

Последнее решение, которое мы сейчас используем. Мы не можем жить с этим из-за пробелов. Я думаю, что если у нас не будет лучшего решения, мы будем жить с чем-то подобным, но с замковым механизмом. –

+0

Я не понимаю, не должно быть пробелов. Вы увеличиваете числа один за другим для каждого клиента. И, конечно, требуется блокировка. Ну, другим решением будет «таблица для каждого клиента» - это используется МНОГИМИ компаниями, например. MS ;-) - но я никогда не рекомендую. Во всяком случае, с центральным сервером БД это не очень интересная проблема ;-) – queen3