Миграция из SAP в 1С: как MD5 от ключа заменил блокировки на миграции 28 тысяч позиций

Источник

При миграции из SAP в 1С:ERP потребовалось разово загрузить около 28 тысяч карточек номенклатуры. Особые сложности возникли не с самой номенклатурой, а с зависимыми справочниками, такими как номенклатурные группы и виды, которые создавались автоматически в процессе загрузки. Исходный формат обмена представлял собой XML-сообщения, приходящие через 1С-шину, где каждое сообщение содержало одну позицию номенклатуры и текстовые наименования для связанных сущностей, таких как группа или вид, без их уникальных идентификаторов. Ограничение потока на стороне SAP составляло не более 5000 сообщений каждые 15 минут, что было принято за предел нагрузки для сервера.

Для обработки сообщений была внедрена схема с использованием журнала обмена, где веб-сервис складывал входящие данные в регистр сведений со статусом «Не обработано», а регламентная обработка разбивала их на порции по 100 сообщений для фоновых заданий. Ключевой проблемой стала гонка при создании сущностей: поскольку зависимые значения приходили только наименованием, их нормализация и поиск осуществлялись в два шага. Между моментом проверки существования элемента и его созданием мог вступить в работу другой поток, что приводило к дублированию записей. Классический сценарий конфликта возникал, когда несколько потоков одновременно не находили группу по нормализованному наименованию и создавали её с разными случайными GUID.

Первой попыткой решения стала реализация исключительных управляемых блокировок на все GUID сущностей сообщения одним элементом блокировки. Это позволяло сериализовать доступ к ключам и выполнять поиск с последующим созданием в одном транзакционном блоке. Однако этот подход не спас от проблем в полной мере и требовал сложной логики с временными таблицами для объединения результатов поиска по GUID и по ключу. В итоге авторы пришли к решению, основанному на генерации уникального GUID для каждой сущности на основе её ключа поиска с использованием функции MD5, что позволило избежать необходимости в блокировках и обеспечило целостность данных при массовой параллельной загрузке.

Текст подготовлен нейросетью Loople по материалам источника.

Читайте также

Похожие новости

Поиск по Loople

Назад