LTS (планировщик легких задач) в основном используется для решения задач планирования распределенных задач и поддерживает задачи реального времени, запланированные задачи и задачи Cron. Он обладает хорошей масштабируемостью, надежностью и стабильностью и используется многими компаниями. Мы также надеемся, что энтузиасты открытого исходного кода смогут внести свой вклад вместе.
Адрес Github: https://github.com/ltsopensource/light-task-scheduler.
адрес ощины: 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, JobTracker и TaskTracker无状态
. Несколько из них могут быть развернуты и динамически удалены для достижения балансировки нагрузки и большей грузоподъемности, а платформа использует стратегию FailStore, чтобы обеспечить хорошую отказоустойчивость LTS.
Центр регистрации LTS предоставляет несколько реализаций (Zookeeper, redis и т. д.). Центр регистрации предоставляет информацию об узлах и выбирает мастеров. (Mongo или Mysql) хранит очереди задач и журналы выполнения задач, netty или mina обеспечивают базовую связь и предоставляют несколько методов сериализации, таких как fastjson, hessian2, java и т. д.
LTS поддерживает типы задач:
Поддерживает динамическое изменение параметров задач, времени выполнения задач и других настроек, поддерживает динамическое добавление задач в фоновом режиме, поддерживает приостановку задач Cron, поддерживает ручную остановку выполнения задач (условную), поддерживает статистику мониторинга задач, поддерживает мониторинг выполнения задач каждого узла , JVM-мониторинг и т. д.
На рисунке ниже показан стандартный процесс выполнения задачи в реальном времени.
В настоящее время серверная часть имеет простую функцию аутентификации, предоставляемую ztajy. Имя пользователя и пароль находятся в файле auth.cfg и могут быть изменены пользователем.
LTS вообще может обойтись без фреймворка Spring, но, учитывая, что многие пользовательские проекты используют фреймворк Spring, LTS также обеспечивает поддержку Spring, включая Xml и аннотации, достаточно ввести lts-spring.jar
.
На стороне TaskTracker предусмотрен бизнес-регистратор для использования приложениями. С помощью этого бизнес-журнала можно отправлять бизнес-журналы в JobTracker. Эти бизнес-журналы можно объединять по идентификаторам задач, а выполнение задач можно просматривать в режиме реального времени в LTS. - График работы администратора.
Расширение SPI может обеспечить нулевое вторжение. Необходимо только реализовать соответствующий интерфейс, и его можно использовать в LTS. В настоящее время открыты интерфейсы расширения.
Когда TaskTracker, выполняющий задачу, выходит из строя, JobTracker немедленно распределяет все задачи, назначенные отключенному TaskTracker, другим обычным узлам TaskTracker для выполнения.
Мониторинг ресурсов, мониторинг задач и т. д. можно выполнять на узлах JobTracker и TaskTracker, а также просматривать их в фоновом режиме управления LTS-Admin в режиме реального времени для выполнения разумного распределения ресурсов.
Платформа LTS обеспечивает поддержку четырех результатов выполнения: EXECUTE_SUCCESS
, EXECUTE_FAILED
, EXECUTE_LATER
и EXECUTE_EXCEPTION
, а также применяет соответствующие механизмы обработки для каждого результата, например повторную попытку.
Механизм FailStore используется для обеспечения отказоустойчивости узла. Fail And Store не повлияет на работу текущего приложения из-за нестабильности удаленной связи. Конкретные инструкции по FailStore см. в инструкциях FailStore в описании концепции.
Проект в основном построен с использованием maven и в настоящее время обеспечивает упаковку сценариев оболочки. Зависимости среды: Java(jdk1.6+)
Maven
Использование пользователем обычно делится на два типа:
Вы можете загрузить пакет lts jar на локальный склад с помощью команды maven. Добавьте соответствующий репозиторий в родительский pom.xml и загрузите его с помощью команды развертывания. Конкретные методы цитирования см. в примерах в разделе lts.
Каждый модуль lts необходимо упаковать в отдельный jar-пакет, а все пакеты зависимостей lts необходимо импортировать. Для получения конкретной информации о том, какие пакеты jar, вы можете обратиться к примерам в lts.
Для компиляции и развертывания предоставляются две версии сценариев (cmd)windows
и (shell)linux
:
Запуск сценария sh build.sh
или build.cmd
в корневом каталоге создаст папку lts-{version}-bin
в каталоге dist
.
Ниже приведена структура каталогов, в которой каталог bin в основном содержит сценарии запуска JobTracker и LTS-Admin. jobtracker
содержит файл конфигурации JobTracker, а пакет jar, который необходимо использовать, — это пакет war и файл конфигурации, связанный с lts-admin
-Admin. Файловая структура lts-{version}-bin
-- 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, вам нужно скопировать зоопарк, например, дать ему имя. zoo2
, измените файл конфигурации в разделе zoo2
, а затем запустите sh jobtracker.sh zoo2 start
. Журнал jobtracker-zoo.out
создается в папке журналов.conf/lts-monitor.cfg
и conf/lts-admin.cfg
, а затем запустите сценарий sh lts-admin.sh
или lts-admin.cmd
в bin
. Журнал lts-admin.out
будет создан в папке журналов. Если запуск пройдет успешно, адрес доступа будет напечатан в журнале. Пользователи могут получить доступ через этот адрес доступа. Пакеты jar, которые необходимо импортировать в lts, включают lts-jobclient-{version}.jar
, lts-core-{version}.jar
и другие сторонние 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 * * * ?"); // 支持 cronExpression表达式
// 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 >
@ 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, включают lts-tasktracker-{version}.jar
, lts-core-{version}.jar
и другие сторонние jar-файлы.
public class MyJobRunner implements JobRunner {
@ Override
public Result run ( JobContext jobContext ) throws Throwable {
try {
// TODO 业务逻辑
// 会发送到 LTS (JobTracker上)
jobContext . getBizLogger (). info ( "测试,业务日志啊啊啊啊啊" );
} catch ( Exception e ) {
return new Result ( Action . EXECUTE_FAILED , e . getMessage ());
}
return new Result ( Action . EXECUTE_SUCCESS , "执行成功了,哈哈" );
}
}
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 ;
}
@ 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" );
factoryBean . setRegistryAddress ( "zookeeper://127.0.0.1:2181" );
factoryBean . setMasterChangeListeners ( new MasterChangeListener []{
new MasterChangeListenerImpl ()
});
factoryBean . setWorkThreads ( 20 );
Properties configs = new Properties ();
configs . setProperty ( "job.fail.store" , "leveldb" );
factoryBean . setConfigs ( configs );
factoryBean . afterPropertiesSet ();
// factoryBean.start();
return factoryBean . getObject ();
}
}
Описание параметра
Как правило, в JVM требуется только один экземпляр JobClient. Не создавайте новый экземпляр JobClient для каждой задачи. Это приведет к значительной трате ресурсов, поскольку один JobClient может отправлять несколько задач. Одна и та же JVM обычно пытается поддерживать только один экземпляр TaskTracker. Если экземпляров больше, это может привести к пустой трате ресурсов. Если вы столкнулись с TaskTracker, которому необходимо выполнить несколько задач, обратитесь к разделу «Один TaskTracker выполняет несколько задач» ниже.
Иногда бизнес-сценарии требуют выполнения нескольких задач. Некоторые люди могут спросить, требуется ли для выполнения каждого типа задач TaskTracker. Мой ответ — нет. Если вы используете JVM, лучше всего использовать TaskTracker для запуска нескольких задач, поскольку использование нескольких экземпляров TaskTracker в JVM — это пустая трата ресурсов (конечно, когда у вас большое количество определенных задач). , вы можете использовать отдельный узел TaskTracker для выполнения этой задачи). Итак, как мы можем реализовать TaskTracker для выполнения нескольких задач? Ниже приведен справочный пример, который я привел.
/**
* 总入口,在 taskTracker.setJobRunnerClass(JobRunnerDispatcher.class)
* JobClient 提交 任务时指定 Job 类型 job.setParam("type", "aType")
*/
public class JobRunnerDispatcher implements JobRunner {
private static final ConcurrentHashMap < String /*type*/ , JobRunner >
JOB_RUNNER_MAP = new ConcurrentHashMap < String , JobRunner >();
static {
JOB_RUNNER_MAP . put ( "aType" , new JobRunnerA ()); // 也可以从Spring中拿
JOB_RUNNER_MAP . put ( "bType" , new JobRunnerB ());
}
@ Override
public Result run ( JobContext jobContext ) throws Throwable {
Job job = jobContext . getJob ();
String type = job . getParam ( "type" );
return JOB_RUNNER_MAP . get ( type ). run ( job );
}
}
class JobRunnerA implements JobRunner {
@ Override
public Result run ( JobContext jobContext ) throws Throwable {
// TODO A类型Job的逻辑
return null ;
}
}
class JobRunnerB implements JobRunner {
@ Override
public Result run ( JobContext jobContext ) throws Throwable {
// TODO B类型Job的逻辑
return null ;
}
}
Обычно при написании TaskTracker вам нужно только проверить правильность логики реализации JobRunner, но вы не хотите запускать LTS для удаленного тестирования. Для облегчения тестирования LTS предоставляет сокращенный метод тестирования JobRunner. Просто интегрируйте com.github.ltsopensource.tasktracker.runner.JobRunnerTester
в свой собственный тестовый класс и реализуйте методы initContext
и newJobRunner
. Например, пример в lts-examples:
public class TestJobRunnerTester extends JobRunnerTester {
public static void main ( String [] args ) throws Throwable {
// Mock 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 для подключения к платформе LTS.
< 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 >
@ SpringBootApplication
@ EnableJobTracker // 启动JobTracker
@ EnableJobClient // 启动JobClient
@ EnableTaskTracker // 启动TaskTracker
@ EnableMonitor // 启动Monitor
public class Application {
public static void main ( String [] args ) {
SpringApplication . run ( Application . class , args );
}
}
Осталось только добавить соответствующую конфигурацию в application.properties. Подробности см. в примере пакета com.github.ltsopensource.examples.springboot
в lts-example.
Когда машина имеет две сетевые карты во внутренней сети, иногда, если пользователь хочет, чтобы трафик LTS проходил через внешнюю сетевую карту, ему необходимо изменить адрес сопоставления имени хоста с адресом внешней сетевой карты на хосте. то же самое касается внутренней сети.
Если идентификатор узла установлен при запуске узла, LTS по умолчанию установит UUID в качестве идентификатора узла. Читабельность будет плохой, но уникальность каждого узла может быть гарантирована, если пользователь может гарантировать уникальность узла. ID сам по себе он может setIdentity
, например, если каждый узел развернут на машине (виртуальной машине), тогда идентификатор можно установить на имя хоста
Поддержка расширений SPI для JobLogger, JobQueue и т. д.
См. выпуск № 389.
Опыт работы более трёх лет
Требования к образованию Степень бакалавра
Уровень ожиданий P6 (старший инженер Java)/P7 (технический эксперт)
Описание работы
Платформа членства отвечает за пользовательскую систему Alibaba Group, поддерживает потребности пользователей различных направлений бизнеса внутри группы, а также поддерживает пользовательские и бизнес-каналы внешнего сотрудничества группы. Включая вход и авторизацию пользователей, систему сеансов, регистрацию, управление учетными записями, безопасность учетных записей и другие функции на каждом конце, базовые информационные службы пользователей, управление сеансами и учетными данными и т. д., это одна из основных линеек продуктов группы, включающая сотни ежедневный объем в миллиарды вызовов, пиковое количество запросов в секунду в десятки миллионов, глобально распределенная гибридная облачная архитектура и т. д.
В качестве инженера-программиста вы будете работать над нашими основными продуктами, которые обеспечивают критически важные функции для нашей бизнес-инфраструктуры. В зависимости от ваших интересов и опыта вы можете работать в одной или нескольких из следующих областей: глобализация, взаимодействие с пользователем, безопасность данных, машинное обучение. , высокая доступность системы и многое другое.