Многие разработчики сталкиваются с ситуацией, когда тяжелые вычислительные алгоритмы, запускаемые в фоновом режиме, парализуют работу всей информационной системы. Пользователи жалуются на медленный отклик интерфейса, а системные администраторы фиксируют пиковые нагрузки на процессор и дисковую подсистему. В данной статье мы разберем, почему попытки «подключить базу к другому серверу 1С» являются опасными, и рассмотрим профессиональные методы масштабирования нагрузки.
Возникает соблазн просто создать второй кластер серверов и направить его на ту же самую базу данных SQL, чтобы «разделить потоки». Это категорически запрещено архитектурой 1С по нескольким причинам:
Наиболее правильный и профессиональный путь — это создание полноценного кластера серверов, где вычислительная нагрузка будет изолирована от пользовательской на уровне настроек самой платформы.
BackgroundJob.CommonModule.<ИмяМодуля>.<ИмяМетода>.Таким образом, тяжелые расчеты будут автоматически перенаправляться на выделенные мощности, оставляя пользовательские процессы на основном сервере.
Если узким местом является не только процессор сервера приложений, но и сервер СУБД, отличным решением будет создание узла РИБ. Это позволит физически вынести тяжелые расчеты на отдельную базу, которая синхронизируется с центральной.
Преимущества данного подхода:
Чтобы реализовать этот сценарий, настройте обмен данными таким образом, чтобы первичные документы и результаты расчетов транслировались между узлами по расписанию, например, в ночное время или через короткие интервалы времени.
Если расчет занимает часы, в 99% случаев проблема заключается не в мощности железа, а в алгоритмической сложности или некорректной работе с запросами. Перед покупкой новых серверов проанализируем текущие алгоритмы:
РегистровСведений для накопления промежуточных данных.Рассмотрим пример того, как можно оптимизировать запись результатов, чтобы снизить нагрузку на СУБД:
// Пример накопления данных перед записью
МассивРезультатов = Новый Массив;
Для каждого Элемент Из ИсходныеДанные Цикл
// Вычисляем результат
Результат = АлгоритмРасчета(Элемент);
МассивРезультатов.Добавить(Результат);
КонецЦикла;
// Записываем все данные одним транзакционным набором
НаборЗаписей = РегистрыСведений.РезультатыРасчета.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(МассивРезультатов);
НаборЗаписей.Записать();
Не пытайтесь идти путем «хаков» системы вроде одновременного подключения базы к двум серверам. Используйте штатные механизмы Кластера серверов 1С для распределения нагрузки и возможности РИБ для выноса вычислений в изолированную среду. И помните, что грамотная оптимизация кода с помощью ЗамераПроизводительности зачастую дает кратно больший эффект, чем замена оборудования на более дорогое.