Производительность
При работе в высоконагруженной системе, обработке большого объема данных или при решении ресурсоемких задач неизбежно возникает вопрос повышения производительности системы. Добиться этого можно за счет:
- увеличения производительности оборудования,
- оптимизации алгоритмов обработки данных.
Увеличение производительности оборудования – путь дорогой и, в целом, не самый оптимальный. Оптимизация алгоритмов обработки данных выглядит предпочтительней, но и она имеет свой предел. Но и тот и другой путь не дадут революционного эффекта.
Однако если логика решаемой задачи позволяет распараллелить процессы обработки данных, то распараллеливание - это наиболее и эффективный способ кратного увеличения производительности системы. Многопоточная обработка данных – гармоничный путь развития современных систем учета и 1С не является исключением.
Платформа 1С предоставляет разработчику инструменты для реализации многопоточности - фоновые задания. В типовых конфигурациях 1С можно встретить примеры многопоточной обработки данных, к примеру, при обновлении конфигураций или расчете амортизации ОС. Однако удобной библиотеки или набора инструментов для решения прикладных задач типовые конфигурации не предлагают.
Проблемы и решения
У разработчика появляется большая задача по обработке данных. Он придумывает, как разбить большую задачу на порции – пакеты данных, которые могут быть обработаны параллельно. Он разрабатывает алгоритм обработки одного пакета данных, определяется с количеством потоков обработки пакетов – по сути определяет способ обработки пакетов. Теперь ему нужно организовать многопоточную обработку пакетов данных с использованием фоновых заданий и ему неизбежно приходится решать ряд стандартных задач:
- Организовывать хранение пакета данных для обработки в фоновом задании, а также организовывать хранение результата обработки пакета данных.
- Каким-либо образом отслеживать динамику работы фоновых заданий. Зачастую обработка должна быть организована в фиксированное число потоков. Необходимо отслеживать момент завершения обработки одних пакетов данных и своевременно запускать фоновые задания для обработки еще не обработанных пакетов данных.
- Реализовать способ управления многопоточной обработкой пакетов данных. Останавливать/запускать процесс, увеличивать/уменьшать количество потоков обработки и пр.
- Следить за работоспособностью запущенных фоновых заданий. Фоновые задания могут завершаться аварийно, быть завершены кластером серверов 1С, зависать и пр. Нужно каким-либо образом диагностировать эти ситуации и запускать повторную обработку пакетов данных, которые обрабатывались в аварийном фоновом задании. Также может потребоваться прервать работу фонового задания, если оно имеет признаки зависания.
- Налаживать логирование процесса обработки пакета данных. Часто нужно хранить не только информацию о факте запуска/завершения обработки пакета, но и дополнительную информацию с описанием хода процесса обработки пакета данных.
Для решения этих и многих других (менее явных, но не менее важных) задач предназначена конфигурация «Универсальные механизмы: пакеты данных».
Конфигурация «Универсальные механизмы: пакеты данных» может быть внедрена в любую конфигурацию на платформе 1С 8.3 без доработок. Она полностью независима и самодостаточна.
Базовые понятия
В конфигурации есть 2 основных понятия, вокруг которых строится вся работа:
- Пакет данных
- Способ обработки пакетов данных
Пакет данных
Пакет данных описывает порцию данных какой-либо задачи, которая может быть обработана независимо.
У каждого пакета данных есть данные пакета – произвольный набор сведений (массив ссылок, двоичные данные, таблица значений, …), который используется при обработке этого пакета.
Пакет данных имеет статус, который зависит от результата его обработки:
- К обработке – пакет еще не обработан.
- В обработке – в данный момент пакет обрабатывается.
- Обработан – пакет успешно обработан.
- Ошибка – при обработке пакета возникла ошибка.
Для пакета данных ведется лог его обработки, а также хранится результат его обработки.
Ну и главное – пакет данных обязательно содержит ссылку на способ обработки пакетов.
Способ обработки пакетов
Способ обработки пакетов описывает то, каким образом должны быть обработаны пакеты. Это справочник, каждый элемент которого содержит строку с именем функции, которая будет вызвана в рабочих фоновых заданиях по обработке пакета.
Способ обработки содержит ряд свойств, описывающий параметры многопоточной обработки. К примеру:
- Количество параллельных рабочих потоков.
- Максимальное время жизни рабочего ФЗ – это время, которое мы отводим на обработку нашего пакета данных. Если оно истекло – система автоматически прервет рабочее фоновое задание, в котором обрабатывается этот пакет.
Также в способе обработки пакетов определяется, каким образом должны быть обработаны возникающие ошибки обработки пакета и параметры автоматической отправки пакета на повторную обработку.
Все эти данные определяют то, каким образом будет организована многопоточная обработка пакетов.
Организация многопоточной обработки
Многопоточная обработка организуется с использованием фоновых заданий. У фоновых заданий есть 2 роли:
- Рабочее ФЗ – в этом фоновом задании выполняется написанный Разработчиком алгоритм по обработке пакета данных.
- Управляющее ФЗ – данное фоновое задание занимается запуском рабочих ФЗ и отслеживанием их состояния.
Управляющее ФЗ запускается для каждого способа обработки отдельно в регламентном задании по обработке пакетов данных.
Укрупненно алгоритм работы системы следующий:
- По расписанию запускается РЗ обработки пакетов. В нем выбираются необработанные пакеты с активным способом обработки.
- Для каждого способа обработки запускается управляющее ФЗ, куда передается выборка необработанных пакетов по этому способу, а также параметры многопоточной обработки.
- Управляющее ФЗ в течение времени своей жизни организует многопоточную обработку пакетов в рабочих ФЗ.
По истечении времени жизни управляющего ФЗ оно завершает свою работу, даже если не все пакеты были обработаны. Необработанные пакеты будут переданы в новое управляющее ФЗ при очередном запуске регламентного задания обработки пакетов.
Так как считывание параметров способа обработки пакетов производится каждый раз при запуске нового управляющего ФЗ, становится возможным управлять многопоточной обработкой, изменяя параметры способа обработки. Можно остановить/запустить обработку пакетов, изменить количество параллельных рабочих потоков и пр.
Быстрый старт
Рассмотрим основные понятия и объекты, которые используются в конфигурации на простейшем примере – решении БОЛЬШОЙ ЗАДАЧИ.
БОЛЬШАЯ ЗАДАЧА: нужно заполнить поля и записать 100 тысяч элементов справочника. Каждый элемент может быть обработан независимо, но обработка трудоемка.
Для организации многопоточной обработки БОЛЬШОЙ ЗАДАЧИ её нужно разбить на маленькие порции – пакеты данных, которые могут быть выполнены параллельно. У каждого пакета данных есть свои входящие параметры – данные пакета, которые определяют, какая часть БОЛЬШОЙ ЗАДАЧИ будет выполнена при обработке этого пакета. При этом нам нужно указать способ обработки пакета, который будет хранить информацию о том, какая функция будет обрабатывать наши пакеты данных и сколько параллельных рабочих потоков будет запущено для обработки.
Создание обработчика пакета данных
Создадим в любом серверном модуле экспортную функцию – обработчик пакета данных. В качестве данных пакета выступает массив из нескольких элементов справочника из нашей БОЛЬШОЙ ЗАДАЧИ в 100 тысяч элементов.
Функция ОбработчикПакетаДанных(Данные, ПараметрыПакетаДанных, ПараметрыСпособаОбработки) Экспорт
// Данные – это массив с порцией ссылок
// В ТЧРезультат мы будем хранить результат обработки наших данных
ТЧРезультат = Новый ТаблицаЗначений;
ТЧРезультат.Колонки.Добавить(«СсылкаЭлемент»);
ТЧРезультат.Колонки.Добавить(«ОписаниеРезультата»);
// Приступим к обработке данных пакета
НачатьТранзакцию();
Для каждого СсылкаЭлемент из Данные Цикл
// в этой функции происходит непосредственно обработка ссылки
ОписаниеРезультата = ОбработатьЭлементСправочника(СсылкаЭлемент);
СтрРезультат = ТЧРезультат.Добавить();
СтрРезультат.СсылкаЭлемент = СсылкаЭлемент;
СтрРезультат.ОписаниеРезультата = ОписаниеРезультата;
КонецЦикла;
ЗафиксироватьТранзакцию();
// Пакет обработан – сообщим системе, как завершилась обработка.
РезультатОбработкиПакета = Новый Структура;
РезультатОбработкиПакета.Вставить(«СостояниеПакетаДанных», Перечисления.ум_СостоянияПакетаДанных.Обработан);
РезультатОбработкиПакета.Вставить(«Сообщение», «Обработано: »+Данные.Количество()+« элементов.»);
РезультатОбработкиПакета.Вставить(«Результат», ТЧРезультат);
Возврат РезультатОбработкиПакета;
КонецФункции
В функции ОбработатьЭлементСправочника происходит непосредственно обработка элемента справочника. Функция возвращает структуру с описанием результата обработки элемента.
РезультатОбработкиПакета – структура, описывающая то, как завершилась обработка пакета данных. Следует отметить, что в случае возникновения ошибок при обработке пакета, система самостоятельно это диагностирует и запишет в лог работы пакета описание возникшей ошибки.
Описание способа обработки пакета
Откроем справочник «Способы обработки пакетов» и создадим там новый элемент с наименованием «Большая задача». Заполним его следующим образом:
При создании способа обработки мы указали, что обработка будет вестись в десять параллельных потоков. Остальные параметры оставим без изменений.
Создание пакетов данных
Теперь нам осталось создать пакеты данных, которые будут обработаны нашим способом обработки пакетов. Для этого выполним следующий код:
Процедура СоздатьПакетыОбработки(БольшойМассивСсылок)
РазмерПорции = 10; // максимальный размер порции данных на пакет
// алгоритм ниже разбивает большую задачу на части и для каждой части создает пакет данных
ТекущаяПорция = Неопределено;
Для каждого СсылкаЭлемент из БольшойМассивСсылок Цикл
Если ТекущаяПорция = Неопределено Тогда
ТекущаяПорция = Новый Массив;
КонецЕсли;
ТекущаяПорция.Добавить(СсылкаЭлемент);
Если ТекущаяПорция.Количество() >= РазмерПорции Тогда
Результат = ум_ПакетыДанныхСерверПривелегированный.СоздатьНовыйПакетДанных(ТекущаяПорция, «Большая задача»);
Если Резульатат.ОшибкаЗаписиПакета Тогда
ВызватьИсключение Результат.ОписаниеОшибки;
КонецЕсли;
ТекущаяПорция = Неопределено;
КонецЕсли;
КонецЦикла;
Если НЕ ТекущаяПорция = Неопределено Тогда
ум_ПакетыДанныхСерверПривелегированный.СоздатьНовыйПакетДанных(ТекущаяПорция, «Большая задача»);
Если Резульатат.ОшибкаЗаписиПакета Тогда
ВызватьИсключение Результат.ОписаниеОшибки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
У функции СоздатьНовыйПакет() два обязательных параметра:
- Данные – произвольное значение. Данные пакета.
- ИмяСпособаОбработки – наименование способа обработки, которым созданный пакет должен быть обработан.
Функция СоздатьНовыйПакет() возвращает структуру данных, которая содержит:
- идентификатор созданного пакета данных;
- флаг ошибки записи пакета;
- описание ошибки записи нового пакета (если она произошла).
В результате вызова функции СоздатьНовыйПакет() в системе будет зарегистрирован новый пакет в статусе «К обработке».
ГОТОВО!!!
При установке флага «Активность» в способе обработки пакетов «Большая задача» система автоматически запустит многопоточную обработку пакетов.
Особенности работы
Система имеет ряд особенностей, позволяющих значительно облегчить разработку и администрирование многопоточной обработки. Некоторые из них приведены ниже.
Лог работы с пакетом данных
Система автоматически ведет полный лог работы с пакетом. Когда и каким ФЗ пакет был взят в работу, сколько времени обрабатывался. Сколько попыток обработать пакет было предпринято и пр.
Если при обработке пакета пользователь в структуре результата указал какое-либо значение как результат обработки пакета – его можно также просмотреть в логе обработки пакетов.
Повторная обработка пакетов
Предусмотрен гибкий механизм повторной обработки пакетов. Можно указать количество попыток повторной обработки пакета, интервал повторной обработки пакета. Кроме того, можно указать список ошибок обработки пакета, при возникновении которых необходимо продолжить попытки обработать пакет.
К примеру, в способе обработки можно указать, что если обработка пакета завершилась с ошибкой, содержащей строку «Конфликт блокировок при выполнении транзакции», то такой пакет будет повторно направлен на обработку через заданный промежуток времени.
С использованием повторной обработки можно построить систему ожидания, когда пакет будет ожидать наступления момента, когда он может быть обработан.
К примеру, пакет «Загрузка счет-фактуры» может ожидать появления в системе ссылки на свой документ-основание «Поступление ТМЦ» в течение заданного периода. Для этого при обработке пакета, если документ основание не найден, достаточно вернуть статус обработки пакета «К обработке», а если найден – создать счет-фактуру и вернуть статус «Обработан».
Администрирование пакетов
В способе обработки пакетов можно управлять механизмом автоматического удаления успешно обработанных пакетов. Пакеты могут удаляться либо сразу после успешной обработки, либо через указанное количество часов.
Средства отладки
Отладка процедур, выполняющихся в фоновых заданиях, в 1С организована не очень эргономично. При использовании пакетов же отладка упрощается, так как пакет можно обработать в клиентской сессии.
Для этого достаточно открыть список пакетов, выделить нужные и нажать кнопку «Обработать пакеты». В этом случае обработка будет вестись в сеансе пользователя. Нет необходимости подключать отладчик к фоновым заданиям.
Кроме того, один и тот же пакет можно обработать многократно, так как он хранит в себе исходные данные для обработки. Это также позволяет упростить разработку обработчика пакета, так как нет необходимости в генерации порции данных при каждом перезапуске клиента 1С.
Отказоустойчивость
Система анализирует лог работы кластера серверов 1С. Если какое-либо рабочее ФЗ было завершено аварийно / отменено пользователем, то система это отследит и изменит статус пакетов, обрабатываемых этим ФЗ, сформирует лог ошибки. Также анализируется «потеря» ФЗ при перезагрузке кластера серверов 1С.
Кроме того, анализируется, не превысило ли время жизни рабочих ФЗ допустимый предел, установленный в способе обработки пакетов.
Дополнительные возможности
В конфигурации есть ряд сервисных инструментов, упрощающих выполнение различных операций. Приведу описание некоторых из них:
Примеры использования
Кроме описанных выше примеров, пакеты данных успешно используются для:
- Автоматическое фоновое восстановление последовательностей.
- Многопоточное отражение документов в регламентированном учете (для ERP 2, КА 2).
- Реализации обменов между базами данных.
- Обслуживания web-сервисов. При получении данных через web-сервис создается новый пакет данных. Это работает очень быстро и позволяет сократить время жизни web-сессии, а также получить полноценное логирование работы web-интерфейса базы данных.
По возможности я постараюсь описать опыт решения различных задач с использованием пакетов данных в последующих публикациях.
Также в последующих публикациях попробую рассказать о некоторых приемах при работе в HiLoad системах:
- Способ блокировки данных, блокировка которых не предусмотрена платформой. Организация ожидания блокировки и DeadLock в пакетах данных.
- Способы распараллеливания «не распараллеливаемых» алгоритмов.
- …
Подробная информация об объектах и особенностях настройки конфигурации представлена в прилагаемой инструкции. В ней же детально описаны рекомендации по настройке тайминга событий и ограничений времени жизни фоновых заданий.
Кя находится в промышленной эксплуатации на многих крупнейших предприятиях Сибирского федерального округа. Гарантирована работоспособность на платформе 8.3.6 и выше. В конфигурации используются управляемые формы. онфигурация длительное врем
Для скачивания доступна конфигурация с открытым кодом.