Рассказываю свой опыт, как добился параллельности выгрузки из центральной базы РИБ сразу в 70 узлов.
У клиента распределенная база розницы из 70 узлов. Особенность – несимметричность выгрузки – на точки идет большой объем информации – номенклатура, цены, поставки товаров.
От точек приходит мало информации – только продажи.
Поэтому загрузка проходит быстро, практически за 30 минут.
А вот выгрузка идет довольно долго, порой 3 часа.
Хотелось выгружать данные параллельно, но при попытке запуска двух выгрузок сразу получал сообщение о блокировке транзакций.
Пришлось обратиться за помощью клуба на мисту.
Модератор форума Fragster подсказал мне решение, которое оказалось рабочим. Спасибо ему за это!
В справочнике настроек обмена для узла нужно указать единичку в количестве элементов при загрузке и выгрузке данных:
Когда-то давно я тоже столкнулся с блокировками, обмены мешали нормальной работе, я ставил в этом поле значение 200, блокировок было меньше. Оказывается, нужно было идти до конца, до единицы. По умолчанию там стоит ноль, то есть обмен целиком проходит в одной транзакции.
Тут же транзакция фиксируется после каждого прочитанного/выгруженного объекта. Таким образом, база не держит долгие транзакции и можно получить параллельность.
После этого я запустил выгрузки на две точки и убедился, что она прошла нормально.
Затем я сделал пять настроек выполнения обмена, в каждую забросил по 14 точек:
На всякий случай и в самой настройке обмена ставлю размер порции обмена 1 (не изучал, что приоритетнее):
Обмены стартуют одновременно, расписание у каждого одинаковое:
В истории обмена посмотрел – все выгрузки успешные, с зелеными флажками:
На выгрузку в пять потоков отвожу час. На самом деле, проходит минут за 40, причем некоторые потоки заканчиваются раньше, другие позже – в зависимости от количества выгружаемых данных.
Выгрузка в пять потоков довольно сильно нагружает процессор, практически на 100%. Можно снизить количество потоков или стартовать каждый поток со сдвигом в 10-20 минут.
По крайней мере здесь есть выбор, которого нет при последовательных обменах.