Um dos artíficios importantes no momento do desenvolvimento é poder ter tarefas agendadas que executam assíncronamente. Essas tarefas sempre fazem parte de um domínio de negócio que necessitam executar algo periódicamente. A periodicidade é bem diversa, podendo ser algo a cada 5 segundos ou apenas 1 vez no ano.
No desenvolvimento com Spring e/ou Spring Boot, as anotações @EnableScheduling e @Scheduled facilitam a vida do programador há anos.
Porém, no últimos tempos, com o desenvolvimento sendo voltado muito ao contexto de microserviços, surgiu um ~probleminha~: quando escalar horizontal a tarefa agendada ser executada em cada nova instância da aplicação.
Uma das possibilidades para resolver tal problema é separar a lógica da tarefa agendada em uma nova aplicação não escalável horizontalmente. Sendo essa uma abordagem com prós e contras, com contextos que fazem sentido e outros não.
Outra possibilidade é utilizar o ShedLock: uma biblioteca Java com integração ao Spring! Ela possui duas anotações básicas @EnableSchedulerLock e @SchedulerLock que aplicam um lock distribuído nas tarefas/métodos com @Scheduled e fazem com que apenas 1 instância das N rodando execute o que foi agendado.
Os recursos que podem prover esse lock distribuído são vários: JDBCTemplate com algum database, MongoDB, S3, etc.
Segue link no GitHub de um exemplo com Redis: https://github.com/oigorrudel/shedlock-example
Top comments (0)