Batch
|
Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine |
Batch — это концепция разгрузки текущего выполнения от рабочей нагрузки с целью обработки в фоне. Этот подход позволяет запускать команды движка управления процессами на большом количестве экземпляров без блокирования. Он также открепляет вызовы отдельных команд друг от друга.
Например, команда миграции экземпляра процесса может быть выполнена с использованием концепции batch. Это позволяет выполнять миграцию экземпляров процесса асинхронно. При синхронной миграции экземпляра процесса все миграции выполняются в одной транзакции. Прежде всего, для этого требуется, чтобы они все завершились успешно, чтобы можно было закоммитить транзакцию. Для большого набора экземпляров транзакция может стать слишком большой, чтобы ее вообще можно было закоммитить в базу данных. При batch-миграции оба этих недостатка исчезают. Batch-миграция выполняется малыми порциями, каждая из которых использует отдельную транзакцию.
Преимущества:
-
Асинхронное (неблокирующее) выполнение
-
Выполнение может использовать многочисленные потоки и job executor-ы
-
Открепление выполнений, то есть каждая джоба batch-выполнения использует свою собственную транзакцию
Недостатки:
-
Ручной поллинг на завершение выполнения batch
-
Соперничество с другими джобами, выполняемыми движком управления процессами
-
Batch может частично упасть в то время, когда ее подмножество уже было выполнено, например, некоторые экземпляры процесса были смигрированы, а остальные миграции завершились неудачей
Технически batch представляет набор джоб, которые выполняют команду в контексте движка управления процессами.
Batch использует job executor движка управления процессами, чтобы выполнить batch-джобы. Один batch состоит из трех типов джоб:
-
Seed job: создает все batch-выполнения, требуемые для завершения выполнения batch
-
Execution jobs: актуальное выполнение batch-команды, например, миграция экземпляра процесса
-
Monitor job: мониторит прогресс batch-выполнения и его завершения после завершения работы seed job
API
Далее следует обзор Java API для batch.
Создание batch
Batch создается посредством асинхронного выполнения команды движка управления процессами. Вы можете найти список поддерживаемых на настоящий момент типов batch на странице Batch-операции. Java API может использоваться для создания Batch-команд. Чтобы найти реальные примеры использования, см. документацию по конкретным командам.
Отправка запроса к batch
Вы можете отправлять запросы к запущенному batch по id и типу, например, чтобы опросить все запущенные batch миграции экземпляров процессов.
List<Batch> migrationBatches = processEngine.getManagementService()
.createBatchQuery()
.type(Batch.TYPE_PROCESS_INSTANCE_MIGRATION)
.list();
Статистика по batch
Вы можете запрашивать статистику по batch, используя сервис менеджмента. Статистика по batch будет содержать информацию об оставшихся, завершенных и закончившихся неудачей джобах, выполняемых как batch.
List<BatchStatistics> migrationBatches = processEngine.getManagementService()
.createBatchStatisticsQuery()
.type(Batch.TYPE_PROCESS_INSTANCE_MIGRATION)
.list();
История batch
Для уровня истории FULL создается вхождение для исторического batch. Вы можете посылать к нему запрос, используя сервис истории.
HistoricBatch historicBatch = processEngine.getHistoryService()
.createHistoricBatchQuery()
.batchId(batch.getId())
.singleResult();
История также содержит вхождения лога джоб для типов seed, monitor и execution jobs. Вы можете отправлять запросы к соответствующим вхождениям лога джоб по конкретному id определения джобы.
HistoricBatch historicBatch = ...
List<HistoricJobLog> batchExecutionJobLogs = processEngine.getHistoryService()
.createHistoricJobLogQuery()
.jobDefinitionId(historicBatch.getBatchJobDefinitionId())
.orderByTimestamp()
.list();
Вы можете создать конфигурацию для очистки истории завершенных исторических batch-операций.
Приостановка batch
Чтобы поставить выполнение batch и всех соответствующих джоб на паузу, можно использовать функцию приостановки (suspend) сервиса менеджмента.
processEngine.getManagementService()
.suspendBatchById("myBatch");
Приостановленный batch можно затем активировать заново, также с использованием сервиса менеджмента.
processEngine.getManagementService()
.activateBatchById("myBatch");
Удаление batch
Запущенный batch можно удалить, используя сервис менеджмента.
// Delete a batch preserving the history of the batch
processEngine.getManagementService()
.deleteBatch("myBatch", false);
// Delete a batch include history of the batch
processEngine.getManagementService()
.deleteBatch("myBatch", true);
Исторический batch можно удалить с помощью сервиса истории.
processEngine.getHistoryService()
.deleteHistoricBatch("myBatch");
| Для работающего batch, который все еще выполняет джобы, рекомендуется приостановить batch прежде чем удалять его. См. раздел Приостановка batch, чтобы узнать об этом подробнее. |
Приоритетность batch
Так как все джобы в batch исполняются с помощью job executor, можно использовать функциональность приоритизации batch, чтобы настроить приоритет batch-джоб. Приоритетность batch-джоб по умолчанию устанавливается в конфигурации движка управления процессами через batchJobPriority.
Можно настроить приоритетность конкретного определения batch-джобы или даже отдельной джобы, также используя сервис менеджмента.
Batch batch = ...;
String batchJobDefinitionId = batch.getBatchJobDefinitionId();
processEngine.getManagementService()
.setOverridingJobPriorityForJobDefinition(batchJobDefinitionId, 100, true);
Определения джоб
Seed-джоба
Batch изначально создает seed-джобу. Она будет выполняться много раз, чтобы создать все джобы выполнения batch. Например, если пользователь запускает batch миграции экземпляров процессов для 1000 экземпляров процессов. При конфигурации движка управления процессами по умолчанию seed-джоба будет создавать 10 джоб выполнения batch при каждом вызове. Каждая джоба выполнения будет мигрировать один экземпляр процесса. По сумме seed-джоба будет вызвана 100 раз до тех пор, пока она не создаст 1000 джоб выполнения, необходимых для завершения работы batch.
Чтобы получить определение джобы для seed-джобы в batch, можно использовать Java API:
Batch batch = ...;
JobDefinition seedJobDefinition = processEngine.getManagementService()
.createJobDefinitionQuery()
.jobDefinitionId(batch.getSeedJobDefinitionId())
.singleResult();
Чтобы поставить на паузу создание дальнейших джоб выполнения, действие определения seed-джобы может быть приостановлено через сервис менеджмента:
processEngine.getManagementService()
.suspendJobByJobDefinitionId(seedJobDefinition.getId());
Джобы выполнения
Выполнение batch разбивается на несколько джоб выполнения (execution jobs). Конкретное количество джоб зависит от бощего количества джоб в batch и от конфигурации движка управления процессами (см. seed job). Каждая джоба выполнения выполняет актуальную batch-команду для заданного числа вызовов, например, мигрировать некое количество экземпляров процесса. Джобы выполнения будут выполнены в job executor. Они ведут себя как другие джобы, что означает, что они могут закончиться неудачей, и job executor будет пытаться повторно выполнить завершившиеся неудачей джобы выполнения. Корме того, будут созданы incidents для завершившихся неудачей джоб выполнения, для которых не осталось повторных попыток.
Java API может использоваться для получения определения джобы для джоб выполнения в batch, например, для batch миграции экземпляров процесса:
Batch batch = ...;
JobDefinition executionJobDefinition = processEngine.getManagementService()
.createJobDefinitionQuery()
.jobDefinitionId(batch.getBatchJobDefinitionId())
.singleResult();
Чтобы поставить на паузу выполнение дальнейших джоб выполнения в batch, действие определения джобы может быть приостановлено при помощи сервиса менеджмента:
processEngine.getManagementService()
.suspendJobByJobDefinitionId(executionJobDefinition.getId());
Джоба мониторинга
После того, как все джобы выполнения в batch были созданы при помощи seed-джобы, создается джоба мониторинга (monitor job) для batch. Эта джоба регулярно отправляет poll-запросы, чтобы выяснить, завершено ли выполнение batch, то есть, все ли джобы выполнения batch завершены. Интервал поллинга может конфигурироваться через свойство batchPollTime (по умолчанию: 30 секунд) в конфигурации движка управления процессами.
Java API может использоваться для получения определения джобы для джобы мониторинга в batch:
Batch batch = ...;
JobDefinition monitorJobDefinition = processEngine.getManagementService()
.createJobDefinitionQuery()
.jobDefinitionId(batch.getMonitorJobDefinitionId())
.singleResult();
Чтобы предотвратить завершение batch, то есть удаление рантайм данных, можно приостановить действие определение джобы мониторинга при помощи сервиса менеджмента:
processEngine.getManagementService()
.suspendJobByJobDefinitionId(monitorJobDefinition.getId());
Конфигурация
Вы можете сконфигурировать количество джоб, создаваемых каждым вызовом seed-джобы,batchJobsPerSeed (по умолчанию: 100) и количество вызовов на джобу выполнения в batch invocationsPerBatchJob (по умолчанию: 1) в конфигурации движка управления процессами.
Количество вызовов на джобу выполнения в batch можно изменить для каждого типа batch-операций индивидуально с помощью свойства конфигурации движка управения процессами invocationsPerBatchJobByBatchType. В том случае, если вы не задали количество вызовов на batch-джобу по типу, конфигурация полагается на глобальную конфигурацию, заданную через invocationsPerBatchJob.
Вы можете сконфигурировать свойство тремя способами:
-
Программно с помощью плагина движка управления процессами
-
В окружениях, основанных на Spring — через XML-конфигурацию Spring
<bean id="processEngineConfiguration" class="io.openbpm.bpm.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"> <!-- ... --> <property name="invocationsPerBatchJobByBatchType"> <map> <entry key="process-set-removal-time" value="10" /> <entry key="historic-instance-deletion" value="3" /> <!-- in case of custom batch operations --> <entry key="my-custom-operation" value="7" /> </map> </property> </bean> -
В окружении, основанном на Spring Boot — через файл
application.yamlopenbpm.bpm.generic-properties.properties: invocations-per-batch-job-by-batch-type: process-set-removal-time: 10 historic-instance-deletion: 3 my-custom-operation: 7 # in case of custom batch operations
Лицензия и атрибуция
Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .
Оригинал документации: https://docs.camunda.org