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

OSCHINA-MIRROR/braveheart.com-brave-disjob-spring-boot

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

Введение в фреймворк

Основные возможности

  • Нативная интеграция с Spring Boot.
  • Поддержка распределённого выполнения задач, например: если в базе данных имеются 100 записей, то можно разделить их поровну между машинами или использовать метод round-robin для распределения.
  • Этот фреймворк не затрагивает конкретные бизнес-процессы, такие как обеспечение атомарности операций.
  • Для управления повторной попыткой выполнения задач и других стратегий пока нет поддержки, но это может быть добавлено позже.
  • Поддержка расширяемости для учёта весовых коэффициентов узлов.

Версии

Первая версия Angle.M1 — милицейская версия. Вторая версия Angle.M2 — Yöntem 20191007

Архитектурная схема

Архитектурная схема

Инструкции по использованию

  • Для файла pom требуется наличие следующего:
	<dependency>
		  <groupId>com.brave</groupId>
		  <artifactId>brave-disjob-spring-boot-starter</artifactId>
		  <version>Angle.M1</version>
	  </dependency>
  • Каждая задача состоит из основного распределителя задач и исполнителя задач. На данный момент они не объединены, поэтому для реализации одной задачи вам потребуется создать два класса и добавить конфигурацию в properties-файл.
    • application.properties
brave:
  jobs:
    - job: demo1
    - job: demo2
  register:
    center: localhost:2181
switcher: on
demo1:
  switcher: on
  cron: 0/30 * * * * ?

demo2:
  switcher: on
  cron: 0/40 * * * * ?

Здесь Switcher:on можно опустить, так как он предназначен для глобального включения/выключения.Добавление основного распределителя задач

@Slf4j
@Component
public class MainWorker extends BaseWorkerRegister {

    @JobName(name = "demo1")
    public String jobName;

    @Override
    public void run(@NotNull String ids) {
        try {
            TimeUnit.SECONDS.sleep(40);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // Обработка списка, получение максимального и минимального ID, при выполнении задачи необходимо обеспечить атомарность операций, чтобы использовать этот алгоритм распределения.
        List<Integer> idList = processItem(ids);

        int minId = idList.stream().min(Integer::compare).orElse(0);
        int maxId = idList.stream().max(Integer::compare).orElse(0);
        log.info("{} минимум: {}, максимум: {}", jobName, minId, maxId);
    }

    /**
     * Регистрация worker'а.
     */
    @PostConstruct
    public void init() {
        super.init_1(jobName);
    }

}

Метод run, принимает параметр ids, который представляет собой диапазон распределения для каждого узла. Поэтому ваша логика выполнения задач должна быть реализована внутри этого метода. Необходимо добавить метод init в этот класс, просто скопировав его.

Добавление обработчика потока

@Slf4j
@Component
public class MainDispatcher extends Dispatcher {

    @Value("${demo1.switcher}")
    private String switcher;

    @JobName(name = "demo1")
    private String jobName;

    @Scheduled(cron = "${demo1.cron}")
    public void process() {
        if (switcher == null || "off".equals(switcher)) {
            log.info("Распределённая задача отключена.");
            return;
        }
        run(jobName);
    }

    /**
     * Обработка задачи
     */
    @Override
    public void dispatchWork() {
        // Получение списка ID
        List<Integer> ids = Arrays.asList(1, 2, 3, 4, 5, 6);
        writeWorkerData(jobName, ids);
    }
}
```Здесь следует обратить внимание на следующие моменты:

   * `switcher`  это переключатель задачи, который конфигурируется в файле конфигурации.
   * `jobName`  имя задачи, которое задается с помощью специального аннотированного поля и должно совпадать с именем задачи в файле конфигурации.
   * В этом классе есть два основных метода: первый  метод запуска, второй  метод распределения задач.

После создания этих двух классов можно будет запустить приложение, однако потребуется наличие кластера Zookeeper, где все данные будут регистрироваться.

## Версия Angel.M2
* Улучшена регистрация информации о рабочих узлах, если такой узел уже существует, то он не будет заново зарегистрирован.
* Улучшены объекты рабочего узла, они выглядят следующим образом:
```java
@Slf4j
@Component
@EnableBraveDisJob(name = "demo3")
public class MainWorker extends BaseWorkerRegister {

    private String jobName;

    @Override
    public void run(@NotNull String ids) {
        try {
            TimeUnit.SECONDS.sleep(40);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // Обработка списка, получение минимального и максимального ID
        List<Integer> idList = processItem(ids);

        int minId = idList.stream().min(Integer::compare).orElse(0);
        int maxId = idList.stream().max(Integer::compare).orElse(0);
        log.info("{} минимум {}, максимум {}", jobName, minId, maxId);
    }

}
```Сейчас достаточно реализовать метод `run`. Если требуется выводить или записывать информацию о задаче, можно использовать поле `jobName`, которое автоматически будет проинициализировано значением имени задачи из конфигурации.

## 20191012 Улучшения
* Добавлен атрибут job switcher и зарегистрирован в zookeeper.
* Конфигурация в yml файле:
```yml
brave:
  jobs:
    - job: demo3
      switcher: on

Возможные изменения в следующей версии

  • Оптимизация логики autoconfigure, включая:
    • Улучшение логики регистрации, сокращение кода.
    • Объединение worker и dispatcher.
    • Добавление поддержки starter для уровня хранения данных.```python

Пример кода для демонстрации

def register_job_switcher(job_name): # Логика регистрации job switcher pass

register_job_switcher('демо3')


Комментарии ( 0 )

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

Введение

Отмена

Обновления

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

Участники

все

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

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/braveheart.com-brave-disjob-spring-boot.git
git@api.gitlife.ru:oschina-mirror/braveheart.com-brave-disjob-spring-boot.git
oschina-mirror
braveheart.com-brave-disjob-spring-boot
braveheart.com-brave-disjob-spring-boot
master