1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hugui-light-task-scheduler

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Документация для пользователей LTS

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),共同工作并完善它。越多的人支持这个项目,我们发展的动力就越强。如果喜欢本项目,请不要忘记在右上角点击星标按钮。

版本1.7.2-SNAPSHOT(master)的主要变更

  1. 改进JobContext中的BizLogger,移除threadlocal的使用,解决了taskTracker多线程的问题,替换为LtsLoggerFactory.getLogger()方法。

系统概述

LTS由四种主要类型的节点组成:* JobClient: Отвечает за отправку задач и получение обратной связи от выполненной задачи.

  • JobTracker: Отвечает за получение и распределение задач, управление расписанием задач.
  • TaskTracker: Отвечает за выполнение задач и предоставляет обратную связь JobTracker после завершения задачи.
  • LTS-Admin: Отвечает за управление узлами, задачами и мониторингом.

Узлы JobClient, JobTracker и TaskTracker являются безостоянными. Можно установить несколько таких узлов и динамически менять их количество для балансировки нагрузки и увеличения производительности. Кроме того, система использует стратегию FailStore для повышения отказоустойчивости.

LTS регистратура предлагает различные реализации (Zookeeper, Redis и т.д.), регистратура обеспечивает экспонирование информации узлов и выбор главного узла. (MongoDB или MySQL) хранит очередь задач и лог выполнения задач, а также использует Netty или Mina для базового взаимодействия и предоставляет различные способы сериализации данных (FastJSON, Hessian2, Java).LTS поддерживает следующие типы задач:

  • Реальные задачи: задачи, которые должны быть выполнены сразу после отправки.
  • Задачи с расписанием: задачи, которые должны быть выполнены в определённое время, например сегодня в 3 часа ночи (одноразовая задача).
  • Задачи Cron: задачи, которые могут быть запланированы с помощью CronExpression, аналогично Quartz (хотя они не используются Quartz для реализации), например 0 0/1 * * * ?.

Поддержка динамического изменения параметров задач, времени выполнения задачи и других настроек, возможность добавления задач в фоновом режиме, поддержка приостановки задач Cron, возможность ручной остановки выполняющихся задач (при наличии условий), мониторинг и статистика задач, мониторинг выполнения задач на каждом узле, мониторинг JVM и прочее.## Архитектурная схема Архитектура LTS

Описание концепций

Группа узлов

  1. Английское название — NodeGroup. Группа узлов эквивалентна небольшому кластеру; все узлы внутри группы равноправны и предоставляют одинаковые услуги.
  2. В каждой группе узлов есть мастер-узел, который выбирается динамически системой LTS. Когда мастер-узел выходит из строя, система LTS немедленно выбирает новый мастер-узел. Для пользователя доступен API-интерфейс слушателя.

FailStore

  1. Как следует из названия, это используется для хранения данных после ошибки, главным образом для обеспечения отказоустойчивости узлов. При неудачной удалённой передаче данных они временно хранятся локально до восстановления связи, после чего данные снова отправляются.
  2. FailStore используется в контексте задач JobClient, обратной связи TaskTracker и передачи бизнес-журналов TaskTracker.
  3. FailStore предоставляет несколько реализаций: leveldb, rocksdb, berkeleydb, mapdb, ltsdb. Это позволяет выбрать наиболее подходящую реализацию, а также использовать расширение SPI для внедрения собственной реализации.## Процесс выполнения задач Ниже приведена схема стандартного процесса выполнения задач в реальном времени. Процесс LTS## Новый интерфейс LTS-Admin Интерфейс LTS-Admin На данный момент в фоновом режиме имеется простая система аутентификации, предоставленная ztajy. Логины и пароли находятся в файле auth.cfg, который можно самостоятельно изменять.

Характеристики

1. Поддержка Spring

LTS может работать без использования фреймворка Spring, но учитывая, что многие проекты используют этот фреймворк, LTS также предлагает поддержку Spring, включая XML и аннотации. Достаточно добавить библиотеку lts-spring.jar.

2. Журналы бизнес-операций

На стороне TaskTracker предоставляется бизнес-логгер для использования приложениями; с помощью этого бизнес-логгера можно отправлять бизнес-логи в JobTracker. Эти бизнес-логи могут быть связаны через идентификатор задачи и просматриваться в режиме реального времени в LTS-Admin.

3. Поддержка расширяемости через SPI

Расширяемость через SPI позволяет достичь нулевой зависимости от системы. Для этого достаточно реализовать соответствующие интерфейсы, после чего они будут использоваться LTS. В настоящее время доступны следующие расширенные интерфейсы:1. Расширение очереди задач, где пользователи могут выбрать использование MySQL или MongoDB в качестве хранилища очередей или создать свою реализацию. 2. Расширение бизнес-логгера, который в настоящее время поддерживает консоль, MySQL и MongoDB. Пользователи также могут расширять его для передачи логов в другие места.### 4. Обработка отказов

При прекращении работы выполняющегося TaskTracker, JobTracker немедленно перераспределяет все задачи, находящиеся на этом узле, между другими работающими TaskTracker-узлами.

5. Мониторинг узлов

Можно осуществлять мониторинг ресурсов и задач для узлов JobTracker и TaskTracker. Это позволяет в режиме реального времени просматривать информацию в административной панели LTS-Admin и эффективно распределять ресурсы.

6. Поддержка различных вариантов выполнения задач

Фреймворк LTS поддерживает четыре типа выполнения задач: EXECUTE_SUCCESS, EXECUTE_FAILED, EXECUTE_LATER, EXECUTE_EXCEPTION. Для каждого типа предусмотрены специальные механизмы обработки, такие как повторная попытка.* EXECUTE_SUCCESS: Успешное выполнение. В этом случае информация немедленно отправляется клиенту (если такой указан).

  • EXECUTE_FAILED: Выполнение завершилось ошибкой. В этом случае информация немедленно отправляется клиенту, но повторная попытка не производится.
  • EXECUTE_LATER: Повторное выполнение позже (необходимо повторное выполнение). В этом случае информация не отправляется клиенту, а используется стратегия повторной попытки через 1 минуту, 2 минуты, 3 минуты. По умолчанию максимальное количество повторных попыток составляет 10, что может быть изменено пользователем.
  • EXECUTE_EXCEPTION: Выполнение завершилось исключением. В этом случае также происходит повторная попытка (стратегия повторной попытки аналогична вышеописанной).### 7. Механизм FailStore для отказоустойчивости

Используется механизм FailStore для обеспечения отказоустойчивости узлов. FailStore представляет собой метод "Fail and Store", который гарантирует, что нестабильность удалённого соединения не повлияет на работу текущего приложения. Дополнительные сведения о FailStore см. в разделе "Концепты" документации.

Компиляция и сборка проекта

Проект использует Maven для компиляции. На данный момент доступен скрипт сборки на Shell.

Зависимости окружения: Java (jdk1. 6+), Maven

Существуют два основных способа использования:

1. Сборка через Maven

Можно использовать команду Maven для загрузки JAR-файлов LTS в локальный репозиторий. В родительском pom.xml необходимо добавить соответствующий репозиторий и использовать команду deploy для загрузки. Примеры использования можно найти в документации LTS.

2. Прямое использование JAR

Для прямого использования JAR-файлов LTS необходимо скачать и добавить их в свой проект. Нужно собрать отдельные JAR-файлы для каждого модуля LTS и включить все зависимости LTS.## Развертывание JobTracker и LTS-Admin Предоставлены скрипты компиляции и развертывания для двух версий: (cmd)Windows и (shell)Linux.

  1. Выполните скрипт sh build.sh или build.cmd в корневой директории. Это создаст папку lts-{version}-bin в директории dist.
  2. Вот структура этой директории, где папка 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
  1. Запуск JobTracker. Чтобы запустить один узел, просто измените конфигурационные файлы в папке 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 (развертывание)

Для использования JobClient требуется импортировать следующие JAR-файлы: lts-jobclient-{version}.jar, lts-core-{version}.jar и другие сторонние зависимости.

Запуск через API

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);

Запуск через Spring XML конфигурацию

<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();
    }
}

TaskTracker (для развертывания)

Необходимо включить 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)

Запуск через API

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();

Запуск через Spring XML

<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>

Запуск через аннотации Spring

@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

Для интеграции задач 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Распределённая система управления задачами, которая поддерживает задачи в реальном времени и периодические задачи (например, выполняемые через 3 дня), а также задачи CronExpression (например: 0 0/1 * * * ?). Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/hugui-light-task-scheduler.git
git@api.gitlife.ru:oschina-mirror/hugui-light-task-scheduler.git
oschina-mirror
hugui-light-task-scheduler
hugui-light-task-scheduler
master