Генератор номеров для PSI WMS
Описан вариант решения с генерацией «почти последовательных» уникальных номеров для разных типов документов.
- Описание
- Подробнее
Описание
Текущее состояние.
Имеестся интерфейс обмена 1С с PSI WMS. Для обмена документами необходимо каждому документу генерировать уникальный номер, связка хранится в регистре сведений «Номера накладных» с измерением «Документ» тип: составной, состоящий из документов обмена и «НомерWMS» тип: число, содержит уникальный номер. Генератор номеров реализован в непереодическом регистре сведений «Счетчик номеров», с измерением «ИмяСчетчика» тип строка, и «Номер», тип целое число. Перед записью документа в регистр сведений «Номера накладных» пишется ссылка документа и уникальный порядоковый номер, получаемы из «Счетчик номеров», счетчик при этом плюсуется. Проблема возникает при получении нового номера. Перед чтением значения из «Счетчик номеров» регистр исключительно блокируется и находится в таком состоянии до конца транзакции, а именно до окончания записи документа. На месте блокировки возникает таймаут.
Решение.
Для реализации параллельного получения номера, был выбран следующий вариант: сделать 100 счетчиков и шаг счетчика не 1, а 100. Чтобы получить номер счетчика используестя генератор случайных чисел. Последовательный перебор исключен, так как небходимо где то хранить значение, которое при каждой генерации будет блокироваться, и возникнет опять узкое место. Данный метод расширяем если не хватает 100 то можно сделать N счетчиков с шагом N. При этом блокировать нужно не весь регистр, а только запись.
При реализации данного метода возникла проблема с случайностью генератора на нагрузочном тесте из 10 фоновых заданий оставались только 3, остальные «падали» на таймауте. При разборе проблемы выяснилось что метод
ГСЧ = Новый ГенераторСлучайныхЧисел();
ГСЧ.СлучайноеЧисло(1, 100); не дает случайности в необходимом размере. В диапазоне целых чисел от 1 до 100 возникали до 8 подряд одинаковых номеров. Такая же проблема возникала при системном генераторе случайных чисел.

