JobRunr — используем для сложных интеграций
Иногда приходится интегрироваться с системами, которые работают в асинхронном режиме, но при этом выставляют API с синхронными вызовами.
Часто возникает такая последовательность действий:
① Отправляем запрос, получаем request_id и время ожидания.
② Ожидаем заданное время.
③ Через некоторое время вызываем метод для получения статуса запроса по request_id, здесь можем либо получить подтверждение выполнения, либо опять уйти в ожидание (переходим в ② и потом опять в ③).
④ Получаем статус выполнения запроса, понимаем, что нужно отправить дополнительные данные.
⑤ Отправляем дополнительные данные, request_id и время ожидания.
⑥ И так далее.
Схематично диаграмма взаимодействия будет выглядеть так:
В этих случаях для реализации планирования задач отлично подойдет JobRunr.
Пример использования JobRunr
Сценарий: наш сервис должен создавать пользователей в другой системе, которая создает записи о пользователях с некоторой задержкой.
- Мы отправляем запрос для создания записи пользователя и переходим в режим ожидания.
- Через некоторое время пытаемся получить статус нашего запроса. Если запись не создана, продолжаем ожидать.
- По прошествии некоторого времени мы получаем результат запроса и фиксируем его в БД.
Подключаем и конфигурируем JobRunr
Для подключения к spring-boot проекту JobRunr нужно добавить библиотеку и spring-boot-starter в pom.xml:
Теперь осталось только настроить свойства в application.yaml:
На этом все, JobRunr готов к работе.
Запускаем отложенную задачу
Для нашего примера сделаем небольшой сервис, который планирует отложенную задачу для проверки статуса запроса:
Помимо schedule, в классе JobScheduler есть множество других методов для создания задач:
- enqueue — добавляет задачу в очередь на обработку.
- createRecurrently — создает повторяющуюся задачу.
Важные моменты production-ready
- Сериализация параметров: JobRunr использует Jackson. Убедитесь, что все аргументы методов с @Job сериализуемы.
- Обработка идемпотентности: обязательно нужно реализовывать функционал так, чтобы обработка задач была идемпотентной.
- Мониторинг через Actuator: для прод сред включайте мониторинг — management.endpoints.web.exposure.include: ..., metrics, jobrunr.
- Ограничение ретраев для критичных задач, иначе задачи не будут выполняться вовсе или будут выполняться дольше, чем нужно.
Что мы получили в итоге?
- Надежность: Если ваш сервис упадет в процессе, после перезагрузки JobRunr увидит незавершенную задачу в PostgreSQL и запустит её снова.
- Масштабируемость: Вы можете запустить 10 экземпляров этого приложения. Благодаря PostgreSQL, задача выполнится ровно один раз тем узлом, который первым её возьмет.
- Визуализация: Перейдите на localhost:8081, и вы увидите красивый дашборд со всей статистикой.
Пример интерфейса дашборда:
Итоги
JobRunr — это идеальный баланс между простотой и мощностью. Он избавляет от необходимости писать свои велосипеды для синхронизации потоков и дает полный контроль над фоновыми процессами.
Использовали уже JobRunr в своих проектах или храните верность Quartz? Пишите в комментариях!
Подпишись на мой канал в telegram