Today todo o hype está em torno das estruturas de processamento distribuído em tempo real, como Apache Hadoop, Apache Kafka ou Apache Spark. Esses frameworks são bem estabelecidos e uma necessidade se você é uma empresa como Facebook, Netflix ou LinkedIn, mas eles não são realmente amigáveis ao desenvolvedor – a curva de aprendizado é alta e gerenciar a infra-estrutura em que eles estão rodando não é uma tarefa trivial.
E, vamos encarar isso – não estamos todos trabalhando para uma empresa como as mencionadas acima – que processa terabytes de dados a cada dia.
Frequentemente só precisamos resolver alguns processos de negócios complexos com uma quantidade moderada de dados. Eu mesmo ainda preciso encontrar meu primeiro cliente que tem mais de um terabyte de dados relevantes dentro do mesmo processo de negócio.
O que eu precisava fazer – já algumas vezes – era, fazer alguns cálculos realmente difíceis em vários gigabytes de dados. E para estes tipos de cálculos, eu nunca encontrei a estrutura Java correta para me ajudar a fazer o trabalho de forma confiável e com código limpo.
Sim, existe o Spring Batch (definitivamente não é o meu favorito) ou Quartz, mas todos esses frameworks fazem você implementar interfaces personalizadas e eles adicionam muito overhead enquanto eu só quero executar algumas tarefas de longa duração em segundo plano.
Então, apresentando JobRunr.io!
JobRunr permite que você crie trabalhos em segundo plano usando apenas o Java 8 lambda’s! Um exemplo:
BackgroundJob.enqueue(() -> myService.doWork());
Esta linha de código garante que o lambda – incluindo tipo, método e argumentos – seja serializado para armazenamento persistente (um RDBMS como Oracle, Postgres, MySql e MariaDB ou um banco de dados NoSQL que será suportado em breve). Um pool dedicado de threads irá então executar esses trabalhos em background enfileirados o mais rápido possível.
Você precisa fazer um cronograma de trabalhos em background amanhã? Na próxima semana? No próximo mês? JobRunr tem você coberto:
BackgroundJob.schedule(() -> System.out.println("Reliable!"), now().plusHours(5));
Evenhos recorrentes nunca foram tão simples – JobRunr permite executar qualquer tipo de tarefa recorrente usando expressões CRON.
BackgroundJob.scheduleRecurringly(() -> service.doWork(), Cron.daily());
Os benefícios:
- Fácil: não há um novo framework para aprender – apenas use suas habilidades Java 8 existentes.
- Simples: como você não precisa implementar interfaces especiais ou estender classes abstratas, seu código é quase agnóstico do JobRunr. Você pode reutilizar seus serviços existentes sem qualquer alteração.
- Tolerante a falhas: Coisas ruins acontecem – um serviço que você consome pode estar em baixo, os discos podem ficar cheios, os certificados SSL expiram, … . Se o JobRunr encontrar uma exceção, por padrão ele irá reprogramar o trabalho de fundo com uma política exponencial de back-off. Se o JobRunr continuar a falhar dez vezes, ele irá para o estado
Failed
. Você pode então decidir re-agendar o trabalho falhado quando a causa raiz tiver sido resolvida. - Transparente: JobRunr inclui um painel embutido que permite que você monitore seus trabalhos. Ele lhe dá uma visão geral de todos os seus trabalhos em background e você pode observar o estado de cada trabalho em detalhes.
- Distribuído: como o trabalho lambda ou em background é serializado para armazenamento persistente, o processo em background pode ultrapassar os limites da JVM e isto permite o processamento distribuído. Você precisa processar 1.000.000 trabalhos em segundo plano? Adicione temporariamente servidores de trabalhos em segundo plano extras – digamos 10 – que podem processar esses trabalhos e seu tempo total de processamento será dividido por quase 10.
- Auto-manutável: você não precisa executar limpeza manual de armazenamento – JobRunr mantém o mais limpo possível e remove automaticamente os trabalhos concluídos com sucesso.