<< Click to Display Table of Contents >> Разработка > Рекомендации по разработке для масштабируемых систем > Оптимизация длительных процессов Транзакции и сессии с большим количеством объектов |
Важно. Не создавайте в транзакции или сессии большое количество объектов. Максимальный рекомендуемый объем – не более 1000 объектов, а для задач – не более 100.
Где нужно учитывать ограничение?
•транзакции, которые используются в событиях сохранения сущностей, событиях блоков схемы задачи или добавлены в программном коде с помощью класса Transaction.
Если в транзакции используется метод сохранения Save(), то это приводит к подгрузке дополнительного объема данных по каждой сущности, в том числе связанных данных по свойствам-ссылкам. Выгруженные по каждой сущности данные сохраняются в течение всей транзакции. В результате процесс сохранения в транзакциях с большим объемом данных работает медленно. Чем больше данных в обработке, тем медленнее сохранение;
•фоновые процессы и асинхронные обработчики, так как они выполняются в рамках одной сессии.
Ограничение связано с тем, что при работе фонового процесса или асинхронного обработчика все сущности, которые были получены в вычислениях, автоматически подгружаются к сессии. Они удаляются из сессии только после завершения вычислений, даже если эти сущности больше не используются в программном коде. В результате, чем больше получено объектов, тем больше памяти необходимо сервису асинхронных событий Worker, и тем больше замедляется скорость сохранения даже одной сущности.
Что делать, если ограничение превышено?
Если планируется, что в транзакции или сессии объектов будет больше, то:
•создавайте объекты порциями по 100 штук и выносите это действие в асинхронный обработчик. Это позволит одновременно выполнять вычисления в несколько потоков (распараллеливать вычисления). Например, такая логика используется при загрузке исторических данных из сервисов обмена в Directum RX;
•в схему задачи добавьте блоки «Условие» и «Скрипт», с помощью которых будет проверяться, отправлены ли все подзадачи в работу. Если отправлены не все, то выполняется скрипт с отправкой следующей порции подзадач. Пример:
© Компания Directum, 2024 |