Добавить в корзинуПозвонить
Найти в Дзене
KIT

JobRunr — используем для сложных интеграций

Иногда приходится интегрироваться с системами, которые работают в асинхронном режиме, но при этом выставляют API с синхронными вызовами. Часто возникает такая последовательность действий: ① Отправляем запрос, получаем request_id и время ожидания. ② Ожидаем заданное время. ③ Через некоторое время вызываем метод для получения статуса запроса по request_id, здесь можем либо получить подтверждение выполнения, либо опять уйти в ожидание (переходим в ② и потом опять в ③). ④ Получаем статус выполнения запроса, понимаем, что нужно отправить дополнительные данные. ⑤ Отправляем дополнительные данные, request_id и время ожидания. ⑥ И так далее. Схематично диаграмма взаимодействия будет выглядеть так: В этих случаях для реализации планирования задач отлично подойдет JobRunr. Сценарий: наш сервис должен создавать пользователей в другой системе, которая создает записи о пользователях с некоторой задержкой. Код примеров доступен здесь, также в корневом каталоге файл main.py с сервисом, имитирующим со
Оглавление

Иногда приходится интегрироваться с системами, которые работают в асинхронном режиме, но при этом выставляют API с синхронными вызовами.

Часто возникает такая последовательность действий:

① Отправляем запрос, получаем request_id и время ожидания.

② Ожидаем заданное время.

③ Через некоторое время вызываем метод для получения статуса запроса по request_id, здесь можем либо получить подтверждение выполнения, либо опять уйти в ожидание (переходим в ② и потом опять в ③).

④ Получаем статус выполнения запроса, понимаем, что нужно отправить дополнительные данные.

⑤ Отправляем дополнительные данные, request_id и время ожидания.

⑥ И так далее.

Схематично диаграмма взаимодействия будет выглядеть так:

-2

В этих случаях для реализации планирования задач отлично подойдет JobRunr.

Пример использования JobRunr

Сценарий: наш сервис должен создавать пользователей в другой системе, которая создает записи о пользователях с некоторой задержкой.

  • Мы отправляем запрос для создания записи пользователя и переходим в режим ожидания.
  • Через некоторое время пытаемся получить статус нашего запроса. Если запись не создана, продолжаем ожидать.
  • По прошествии некоторого времени мы получаем результат запроса и фиксируем его в БД.

Код примеров доступен здесь, также в корневом каталоге файл main.py с сервисом, имитирующим создание пользователя через некоторый промежуток времени.

Важные моменты production-ready

  • Сериализация параметров: JobRunr использует Jackson. Убедитесь, что все аргументы методов с @Job сериализуемы.
  • Обработка идемпотентности: обязательно нужно реализовывать функционал так, чтобы обработка задач была идемпотентной.
  • Мониторинг через Actuator: для прод сред включайте мониторинг — management.endpoints.web.exposure.include: ..., metrics, jobrunr.
  • Ограничение ретраев для критичных задач, иначе задачи не будут выполняться вовсе или будут выполняться дольше, чем нужно.

Что мы получили в итоге?

  1. Надежность: Если ваш сервис упадет в процессе, после перезагрузки JobRunr увидит незавершенную задачу в PostgreSQL и запустит её снова.
  2. Масштабируемость: Вы можете запустить 10 экземпляров этого приложения. Благодаря PostgreSQL, задача выполнится ровно один раз тем узлом, который первым её возьмет.
  3. Визуализация: Перейдите на localhost:8081, и вы увидите красивый дашборд со всей статистикой.

Пример интерфейса дашборда:

-3

Итоги

JobRunr — это идеальный баланс между простотой и мощностью. Он избавляет от необходимости писать свои велосипеды для синхронизации потоков и дает полный контроль над фоновыми процессами.

Использовали уже JobRunr в своих проектах или храните верность Quartz? Пишите в комментариях!

Подробнее в моем telegram-канале

#jobRunr #development #engineering