LTS (light-task-scheduler)主要用于解决分布式任务调度问题,支持实时任务、定时任务和Cron任务。由于其良好的可扩展性、灵活性和可靠的稳定性,被许多公司采用,并吸引了开源爱好者的参与。
GitHub 地址: https://github.com/ltsopensource/light-task-scheduler
OSChina 地址: http://git.oschina.net/hugui/light-task-scheduler
示例代码: https://github.com/ltsopensource/lts-examples
文档地址(正在更新中,后续将使用该链接): https://www.gitbook.com/book/qq254963746/lts/details
这两个地址将会同时进行更新。如果您对该项目感兴趣,请加入QQ群:109500214(群密码:hello world),共同工作并完善它。越多的人支持这个项目,我们发展的动力就越强。如果喜欢本项目,请不要忘记在右上角点击星标按钮。
LTS由四种主要类型的节点组成:* JobClient: Отвечает за отправку задач и получение обратной связи от выполненной задачи.
Узлы JobClient, JobTracker и TaskTracker являются безостоянными. Можно установить несколько таких узлов и динамически менять их количество для балансировки нагрузки и увеличения производительности. Кроме того, система использует стратегию FailStore для повышения отказоустойчивости.
LTS регистратура предлагает различные реализации (Zookeeper, Redis и т.д.), регистратура обеспечивает экспонирование информации узлов и выбор главного узла. (MongoDB или MySQL) хранит очередь задач и лог выполнения задач, а также использует Netty или Mina для базового взаимодействия и предоставляет различные способы сериализации данных (FastJSON, Hessian2, Java).LTS поддерживает следующие типы задач:
0 0/1 * * * ?
.Поддержка динамического изменения параметров задач, времени выполнения задачи и других настроек, возможность добавления задач в фоновом режиме, поддержка приостановки задач Cron, возможность ручной остановки выполняющихся задач (при наличии условий), мониторинг и статистика задач, мониторинг выполнения задач на каждом узле, мониторинг JVM и прочее.## Архитектурная схема
NodeGroup
. Группа узлов эквивалентна небольшому кластеру; все узлы внутри группы равноправны и предоставляют одинаковые услуги.LTS может работать без использования фреймворка Spring, но учитывая, что многие проекты используют этот фреймворк, LTS также предлагает поддержку Spring, включая XML и аннотации. Достаточно добавить библиотеку lts-spring.jar
.
На стороне TaskTracker предоставляется бизнес-логгер для использования приложениями; с помощью этого бизнес-логгера можно отправлять бизнес-логи в JobTracker. Эти бизнес-логи могут быть связаны через идентификатор задачи и просматриваться в режиме реального времени в LTS-Admin.
Расширяемость через SPI позволяет достичь нулевой зависимости от системы. Для этого достаточно реализовать соответствующие интерфейсы, после чего они будут использоваться LTS. В настоящее время доступны следующие расширенные интерфейсы:1. Расширение очереди задач, где пользователи могут выбрать использование MySQL или MongoDB в качестве хранилища очередей или создать свою реализацию. 2. Расширение бизнес-логгера, который в настоящее время поддерживает консоль, MySQL и MongoDB. Пользователи также могут расширять его для передачи логов в другие места.### 4. Обработка отказов
При прекращении работы выполняющегося TaskTracker, JobTracker немедленно перераспределяет все задачи, находящиеся на этом узле, между другими работающими TaskTracker-узлами.
Можно осуществлять мониторинг ресурсов и задач для узлов JobTracker и TaskTracker. Это позволяет в режиме реального времени просматривать информацию в административной панели LTS-Admin и эффективно распределять ресурсы.
Фреймворк LTS поддерживает четыре типа выполнения задач: EXECUTE_SUCCESS
, EXECUTE_FAILED
, EXECUTE_LATER
, EXECUTE_EXCEPTION
. Для каждого типа предусмотрены специальные механизмы обработки, такие как повторная попытка.* EXECUTE_SUCCESS: Успешное выполнение. В этом случае информация немедленно отправляется клиенту (если такой указан).
Используется механизм FailStore для обеспечения отказоустойчивости узлов. FailStore представляет собой метод "Fail and Store", который гарантирует, что нестабильность удалённого соединения не повлияет на работу текущего приложения. Дополнительные сведения о FailStore см. в разделе "Концепты" документации.
Проект использует Maven для компиляции. На данный момент доступен скрипт сборки на Shell.
Зависимости окружения: Java (jdk1. 6+)
, Maven
Существуют два основных способа использования:
Можно использовать команду Maven для загрузки JAR-файлов LTS в локальный репозиторий. В родительском pom.xml необходимо добавить соответствующий репозиторий и использовать команду deploy для загрузки. Примеры использования можно найти в документации LTS.
Для прямого использования JAR-файлов LTS необходимо скачать и добавить их в свой проект. Нужно собрать отдельные JAR-файлы для каждого модуля LTS и включить все зависимости LTS.## Развертывание JobTracker и LTS-Admin
Предоставлены скрипты компиляции и развертывания для двух версий: (cmd)Windows
и (shell)Linux
.
sh build.sh
или build.cmd
в корневой директории. Это создаст папку lts-{version}-bin
в директории dist
.bin
содержит основные скрипты запуска для JobTracker и LTS-Admin. В папке jobtracker
находятся конфигурационные файлы и необходимые JAR-файлы для JobTracker, а в папке lts-admin
— WAR-файлы и конфигурационные файлы для LTS-Admin.-- lts-${version}-bin
|-- bin
|-- jobtracker.cmd
|-- jobtracker.sh
|-- lts-admin.cmd
|-- lts-admin.sh
|-- lts-monitor.cmd
|-- lts-monitor.sh
|-- tasktracker.sh
|-- conf
|-- log4j.properties
|-- lts-admin.cfg
|-- lts-monitor.cfg
|-- readme.txt
|-- tasktracker.cfg
|-- zoo
|-- jobtracker.cfg
|-- log4j.properties
|-- lts-monitor.cfg
|-- lib
|-- *.jar
|-- war
|-- jetty
|-- lib
|-- *.jar
|-- lts-admin.war
conf/zoo
, затем выполните команду sh jobtracker.sh zoo start
. Для запуска двух узлов JobTracker вам потребуется сделать копию папки zoo
с другим именем, например zoo2
, изменить конфигурационные файлы в новой папке и выполнить команду sh jobtracker.sh zoo2 start
. Логи будут записаны в файл jobtracker-zoo.out
.4. Запуск LTS-Admin. Измените конфигурационные файлы conf/lts-monitor.cfg
и conf/lts-admin.cfg
, затем запустите скрипт sh lts-admin.sh
или lts-admin.cmd
из папки bin
. Логи будут записаны в файл lts-admin.out
. При успешном запуске адрес доступа будет выведен в логах, который можно использовать для доступа к приложению.Для использования JobClient требуется импортировать следующие JAR-файлы: lts-jobclient-{version}.jar
, lts-core-{version}.jar
и другие сторонние зависимости.
JobClient jobClient = new RetryJobClient();
jobClient.setNodeGroup("test_jobClient");
jobClient.setClusterName("test_cluster");
jobClient.setRegistryAddress("zookeeper://127.0.0.1:2181");
jobClient.start();
// Отправка задач
Job job = new Job();
job.setTaskId("3213213123");
job.setParam("shopId", "11111");
job.setTaskTrackerNodeGroup("test_trade_TaskTracker");
// job.setCronExpression("0 0/1 * * * ?");
// job.setTriggerTime(new Date());
Response response = jobClient.submitJob(job);
<bean id="jobClient" class="com.github.ltsopensource.spring.JobClientFactoryBean">
<property name="clusterName" value="test_cluster"/>
<property name="registryAddress" value="zookeeper://127.0.0.1:2181"/>
<property name="nodeGroup" value="test_jobClient"/>
<property name="masterChangeListeners">
<list>
<bean class="com.github.ltsopensource.example.support.MasterChangeListenerImpl"/>
</list>
</property>
<property name="jobFinishedHandler">
<bean class="com.github.ltsopensource.example.support.JobFinishedHandlerImpl"/>
</property>
<property name="configs">
<props>
<!-- параметры -->
<prop key="job.fail.store">leveldb</prop>
</props>
</property>
</bean>
```### Запуск через полную аннотацию Spring
```java
@Configuration
public class LTSSpringConfig {
@Bean(name = "jobClient")
public JobClient getJobClient() throws Exception {
JobClientFactoryBean factoryBean = new JobClientFactoryBean();
factoryBean.setClusterName("test_cluster");
factoryBean.setRegistryAddress("zookeeper://127.0.0.1:2181");
factoryBean.setNodeGroup("test_jobClient");
factoryBean.setMasterChangeListeners(new MasterChangeListener[]{
new MasterChangeListenerImpl()
});
Properties configs = new Properties();
configs.setProperty("job.fail.store", "leveldb");
factoryBean.setConfigs(configs);
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
}
Необходимо включить JAR-пакеты lts-tasktracker-{version}.jar
, lts-core-{version}.jar
и другие зависимости от третьих сторон.### Определение своего класса выполнения задач
public class MyJobRunner implements JobRunner {
@Override
public Result run(JobContext jobContext) throws Throwable {
try {
// TODO бизнес-логика
// Будет отправлено на LTS (JobTracker)
TaskTracker taskTracker = new TaskTracker();
taskTracker.setJobRunnerClass(MyJobRunner.class);
taskTracker.setRegistryAddress("zookeeper://127.0.0.1:2181");
taskTracker.setNodeGroup("test_trade_TaskTracker");
taskTracker.setClusterName("test_cluster");
taskTracker.setWorkThreads(20);
taskTracker.start();
<bean id="taskTracker" class="com.github.ltsopensource.spring.TaskTrackerAnnotationFactoryBean" init-method="start">
<property name="jobRunnerClass" value="com.github.ltsopensource.example.support.MyJobRunner"/>
<property name="bizLoggerLevel" value="INFO"/>
<property name="clusterName" value="test_cluster"/>
<property name="registryAddress" value="zookeeper://127.0.0.1:2181"/>
<property name="nodeGroup" value="test_trade_TaskTracker"/>
<property name="workThreads" value="20"/>
<property name="masterChangeListeners">
<list>
<bean class="com.github.ltsopensource.example.support.MasterChangeListenerImpl"/>
</list>
</property>
<property name="configs">
<props>
<prop key="job.fail.store">leveldb</prop>
</props>
</property>
</bean>
@Configuration
public class LTSSpringConfig implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
``````java
@Bean(name = "taskTracker")
public TaskTracker getTaskTracker() throws Exception {
TaskTrackerAnnotationFactoryBean factoryBean = new TaskTrackerAnnotationFactoryBean();
factoryBean.setApplicationContext(applicationContext);
factoryBean.setClusterName("test_cluster");
factoryBean.setJobRunnerClass(MyJobRunner.class);
factoryBean.setNodeGroup("test_trade_TaskTracker");
factoryBean.setBizLoggerLevel("INFO");
// ...
}
try {
jobContext.getBizLogger().info("тест, бизнес-лог");
} catch (Exception e) {
return new Result(Action.EXECUTE_FAILED, e.getMessage());
}
return new Result(Action.EXECUTE_SUCCESS, "выполнение успешно завершено, хаха");
}
## Параметры конфигурации
[Параметры конфигурации](https://qq254963746.gitbooks.io/lts/content/use/config-name.html)
```## Рекомендации по использованию
Обычно в одном JVM требуется всего один экземпляр JobClient. Не создавайте новый экземпляр JobClient для каждого типа задач, так как это приведёт к значительному расходу ресурсов. Один экземпляр JobClient может отправлять различные типы задач. В одном JVM также следует иметь только один экземпляр TaskTracker, чтобы избежать ненужного использования ресурсов. Когда вам нужно выполнить несколько задач с помощью одного TaskTracker, обратитесь к разделу «Выполнение нескольких задач одним TaskTracker».
### Выполнение нескольких задач одним TaskTracker
Иногда бизнес-процесс требует выполнения нескольких задач. Некоторые люди спрашивают, нужен ли отдельный TaskTracker для каждой задачи. Ответ — нет. Лучше использовать один TaskTracker для выполнения нескольких задач внутри одного JVM, поскольку использование нескольких TaskTracker в одном JVM является расточительным (хотя если объём одной задачи очень велик, можно использовать отдельный TaskTracker для её выполнения).
Как же реализовать выполнение нескольких задач одним TaskTracker? Ниже представлен пример.
```java
/**
* Главный входной метод, где taskTracker.setJobRunnerClass(JobRunnerDispatcher.class)
* При отправке задачи через JobClient указывается тип задачи job.setParam("type", "aType")
*/
public class JobRunnerDispatcher implements JobRunner {
private static final ConcurrentHashMap<String /*type*/, JobRunner> JOB_RUNNER_MAP =
new ConcurrentHashMap<String, JobRunner>();
## Тестирование JobRunner в TaskTracker
При создании TaskTracker обычно требуется проверить правильность реализации логики JobRunner, но при этом не хочется запускать LTS для удалённого тестирования. Для удобства тестирования LTS предоставляет быстрый способ тестирования JobRunner. Ваш тестовый класс должен расширять `com.github.ltsopensource.tasktracker.runner.JobRunnerTester`, а также реализовать методы `initContext` и `newJobRunner`. Пример из [lts-examples](https://github.com/ltsopensource/lts-examples):
```java
public class TestJobRunnerTester extends JobRunnerTester {
public static void main(String[] args) throws Throwable {
// Подделка данных Job
Job job = new Job();
job.setTaskId("2313213");
JobContext jobContext = new JobContext();
jobContext.setJob(job);
JobExtInfo jobExtInfo = new JobExtInfo();
jobExtInfo.setRetry(false);
jobContext.setJobExtInfo(jobExtInfo);
// Запуск теста
TestJobRunnerTester tester = new TestJobRunnerTester();
Result result = tester.run(jobContext);
System.out.println(JSON.toJSONString(result));
}
@Override
protected void initContext() {
// TODO Инициализация контейнера Spring
}
@Override
protected JobRunner newJobRunner() {
return new TestJobRunner();
}
}
Для интеграции задач Quartz Cron с Spring достаточно добавить следующий XML-код в конфигурацию:
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myService"/>
<property name="targetMethod" value="execute"/>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>
<bean class="com.github.ltsopensource.spring.quartz.QuartzLTSProxyBean">
<property name="clusterName" value="test_cluster"/>
<property name="registryAddress" value="zookeeper://127.0.0.1:2181"/>
<property name="nodeGroup" value="quartz_test_group"/>
</bean>
```
## Поддержка Spring Boot
```java
@SpringBootApplication
@EnableJobTracker // Запуск JobTracker
@EnableJobClient // Запуск JobClient
@EnableTaskTracker // Запуск TaskTracker
@EnableMonitor // Запуск Monitor
public class Application {
```
``````java
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
Оставшийся шаг — добавление соответствующих конфигураций в application.properties, подробнее см. примеры в пакете `com.github.ltsopensource.examples.springboot` проекта lts-example.
## Вопрос выбора сетевых адаптеров
Когда машина имеет два сетевых адаптера для внутренней сети, иногда пользователи хотят направлять трафик LTS через внешний сетевой адаптер. Для этого достаточно изменить адрес хоста в файле hosts на адрес внешнего сетевого адаптера. Аналогично можно действовать с внутренним сетевым адаптером.
## Вопрос идентификации узлов
Если при запуске узла вы установите его идентификатор, LTS автоматически назначит UUID как идентификатор узла, что может затруднять чтение. Однако это гарантирует уникальность каждого узла. Если вы можете обеспечить уникальность идентификатора узла самостоятельно, используйте метод `setIdentity`, чтобы установить его. Например, если каждый узел развернут на отдельной машине (виртуальной машине), то идентификатор можно установить как имя хоста.## Расширение SPI
Поддерживает расширение SPI для JobLogger, JobQueue и других компонентов.
## Сравнение с другими решениями
См. [сравнение с другими решениями](https://qq254963746.gitbooks.io/lts/content/introduce/compareother.html)
## Решение проблемы отказа LTS-Admin, запущенного Jetty (по умолчанию)
См. [issue#389](https://github.com/ltsopensource/light-task-scheduler/issues/389)
# Вакансия!
### Требования:
- Опыт работы: три года и более
- Образование: высшее
- Уровень должности: P6 (высококвалифицированный Java-инженер) / P7 (технический эксперт)
### Описание позиции:
Вы будете работать над платформой членства Alibaba Group, которая поддерживает потребности пользователей внутри компании и во внешних партнёрах. Ваша работа будет включать управление входом пользователя, системой сессий, регистрацией, управлением аккаунтом, безопасностью аккаунта и другими функциями. Вы также будете управлять информационными службами пользователей, системой сессий и управлениями сертификатами. Это одна из ключевых продуктовых линий группы, ежедневно поддерживающая миллиарды запросов, достигающие пика до нескольких миллионов запросов в секунду, а также глобальную гибридную облачную архитектуру.Как программист, вы будете работать над нашими ключевыми продуктами, обеспечивающими важные функции нашей бизнес-инфраструктуры. В зависимости от ваших интересов и опыта, вы сможете работать в одной или нескольких областях: глобализация,用户体验、数据安全、机器学习、系统高可用性等。1. Независимо выполнять анализ и проектирование средних и крупных проектов, а также завершать детальное проектирование и кодирование, обеспечивая прогресс и качество проекта;
2. Выполнять задачи проверки кода в команде, обеспечивая эффективность и корректность связанного кода, а также предоставлять рекомендации по производительности и стабильности через проверку кода; участвовать в создании универсальной, гибкой и умной платформы для поддержки бизнеса, которая будет поддерживать сложные сценарии верхнего уровня.
Требования к должности
1. Крепкие знания Java программирования, знакомство с популярными открытыми Java фреймворками;
2. Опыт разработки высокопроизводительных и надёжных приложений на основе баз данных, кэша и распределённого хранения, а также навыки работы с операционной системой Linux;
3. Умение эффективно выявлять и проектировать общие фреймы и модули;
4. Любовь к технологиям, внимательность и аккуратность в работе, стремление к высочайшему качеству системы, способность к общению и командной работе;
5. Опыт работы в области создания центральных систем электронной коммерции или финансов предпочтителен;
6. Опыт работы с большими данными, алгоритмами и машинным обучением предпочтителен.
Если вас заинтересовало это предложение, пожалуйста, отправьте своё резюме на адрес hugui.hg@alibaba-inc.com. Мы будем рады вашей заявке.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )