Последовательные числа в распределенном слове - PullRequest
3 голосов
/ 21 сентября 2009

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

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

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

Пожалуйста, помогите с некоторыми идеями. Каждая идея будет ценной. Есть ли ссылки на что-то для чтения по теме?

UPDATE: Хочу подчеркнуть, что мне нужны порядковые номера. И поэтому не может использовать привет / низкие алгоритмы. В настоящее время я изучаю сценарий, когда

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

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

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

Пытаетесь ли вы убедиться, что все заказы имеют уникальные номера, но без центрального местоположения, координирующего распределение номеров?

Вот два варианта для вас.

  1. Допустим, вы ожидаете иметь максимум десять серверов в любой реалистичный период времени. Пусть каждый сервер раздаст порядковые номера в форме 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 голос
/ 22 сентября 2009

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

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 - т.е. вы можете иметь 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...