В этой статье описан метод использования XXL-JOB для обработки сегментированных задач и добавлен гибкий контроль над количеством исполнительных узлов.
Теперь в таблице данных имеется большой объем данных, которые необходимо обработать серверному приложению. Требования:
Поскольку данные в одной и той же таблице данных должны обрабатываться параллельно, естественно подумать о сегментировании для запроса данных. Вы можете использовать метод получения модуля идентификатора для сегментирования данных, чтобы избежать их повторной обработки. данные.
Согласно требованиям пунктов 1 и 2, я изначально хотел добиться этого за счет динамической настройки пула потоков, но учитывая пункт 3, количество узлов сервера может измениться, и узлы не имеют никакой осведомленности или связи друг с другом, поэтому их можно реализовать в приложении. Механизм планирования может быть сложным.
Если бы было неплохо иметь готовый планировщик, независимый от этих серверных узлов. Вслед за этим я подумал о подключенной платформе распределенного планирования задач. XXL-JOB во время чтения Официальная документация Позже выяснилось, что «фрагментная трансляция» & «Динамическое шардинг» очень хорошо подходит для этой ситуации.
Таким образом, мы можем гибко запланировать 1, N узлов для параллельного выполнения задач по обработке данных.
Пример JobHandler:
@XxlJob("demoJobHandler")
public void execute() {
String param = XxlJobHelper.getJobParam();
if (StringUtils.isBlank(param)) {
XxlJobHelper.log("Параметры задачи пусты");
XxlJobHelper.handleFail();
return;
}
// Количество узлов, выполняющих задачи
int executeNodeNum = Integer.valueOf(param);
// порядковый номер фрагмента
int shardIndex = XxlJobHelper.getShardIndex();
// Общее количество осколков
int shardTotal = XxlJobHelper.getShardTotal();
if (executeNodeNum <= 0 || executeNodeNum > shardTotal) {
XxlJobHelper.log("Количество узлов, выполняющих диапазон значений задачи [1, общее количество узлов]");
XxlJobHelper.handleFail();
return;
}
if (shardIndex > (executeNodeNum - 1)) {
XxlJobHelper.log("Текущая фрагментация {} Не надо исполнять", shardIndex);
XxlJobHelper.handleSuccess();
return;
}
shardTotal = executeNodeNum;
// Данные и обработка сегментированных запросов
process(shardIndex, shardTotal);
XxlJobHelper.handleSuccess();
}
Пример сегментированных данных запроса:
select field1, field2
from table_name
where ...
and mod(id, #{shardTotal}) = #{shardIndex}
order by id limit #{rows};
- Одновременно передать число через параметр задачи. Когда один узел обрабатывает задачу, он разделяет запрошенные данные в соответствии с этим числом и передает их в пул. параллельная обработка потоков;
- Конфигурация M индивидуальныйзапланированные задача, указав то же самое JobHandler, пронумеруй их 0、1、2…M,и будетзапланированные задачисерийный номери M Эти два числа передаются параметрами задачи, запланированные В логике задачи сначала на основе параметров фрагментации планируются номер задачи, M, пересчитать новые параметры шардинга, например _порядковый номер фрагмента = (порядковый номер фрагмента \* M) + запланированные задачисерийный номер_,_Общее количество осколков = Общее количество осколков \* M_, затем запросите данные и обработайте их. если можно часто корректировать логику выполнения задач, в том числе возможно добавлять новые параметры задач и т.п. без перезапуска сервера Как решить?
Можно рассмотреть возможность использования XXL-JOB Задачи «GLUE Mode» можно редактировать и обновлять онлайн, запланированные. логика выполнения задачи.