Hoy en día todo el bombo está en torno a los frameworks de procesamiento distribuido en tiempo real, como Apache Hadoop, Apache Kafka o Apache Spark. Estos marcos están bien establecidos y son una necesidad si usted es una empresa como Facebook, Netflix o LinkedIn, pero no son realmente amigables para los desarrolladores – la curva de aprendizaje es alta y la gestión de la infraestructura en la que se ejecutan no es una tarea trivial.
Y, seamos sinceros – no todos estamos trabajando para una empresa como las mencionadas anteriormente – que procesan terabytes de datos cada día.
A menudo sólo tenemos que resolver algunos procesos de negocio complejos con una cantidad moderada de datos. Yo mismo todavía tengo que conocer a mi primer cliente que tiene más de un terabyte de datos relevantes dentro del mismo proceso de negocio.
Lo que sí he tenido que hacer -ya un par de veces- es, realizar algunos cálculos realmente difíciles sobre varios gigabytes de datos. Y para este tipo de cálculos, nunca encontré el framework Java adecuado que me ayudara a realizar el trabajo de forma fiable y con un código limpio.
Sí, está Spring Batch (definitivamente no es mi favorito) o Quartz, pero todos estos frameworks te obligan a implementar interfaces personalizadas y añaden mucha sobrecarga mientras que yo sólo quiero ejecutar algunas tareas de larga duración en segundo plano.
Así que, ¡presentando JobRunr.io!
¡JobRunr te permite crear trabajos en segundo plano usando sólo lambdas de Java 8! Un ejemplo:
BackgroundJob.enqueue(() -> myService.doWork());
Esta única línea de código se asegura de que la lambda -incluyendo el tipo, el método y los argumentos- se serialice a un almacenamiento persistente (un RDBMS como Oracle, Postgres, MySql y MariaDB o una base de datos NoSQL que será soportada pronto). Un grupo de hilos de trabajo dedicado ejecutará estos trabajos en segundo plano tan pronto como sea posible.
¿Necesita programar un trabajo en segundo plano mañana? ¿La próxima semana? ¿El próximo mes? JobRunr le tiene cubierto:
BackgroundJob.schedule(() -> System.out.println("Reliable!"), now().plusHours(5));
Incluso los trabajos recurrentes nunca han sido más sencillos – JobRunr permite realizar cualquier tipo de tarea recurrente utilizando expresiones CRON.
BackgroundJob.scheduleRecurringly(() -> service.doWork(), Cron.daily());
Las ventajas:
- Fácil: no hay ningún marco nuevo que aprender – sólo tiene que utilizar sus habilidades existentes de Java 8.
- Simple: como no necesitas implementar interfaces especiales o extender clases abstractas, tu código es casi agnóstico de JobRunr. Puedes reutilizar tus servicios existentes sin ningún cambio.
- Tolerante a fallos: Las cosas malas suceden – un servicio que usted consume puede estar abajo, los discos pueden llenarse, los certificados SSL expiran, … . Si JobRunr encuentra una excepción, por defecto reprogramará el trabajo en segundo plano con una política de retroceso exponencial. Si el trabajo en segundo plano sigue fallando diez veces, pasará al estado
Failed
. A continuación, puede decidir volver a poner en cola el trabajo fallido cuando se haya resuelto la causa raíz. - Transparente: JobRunr incluye un tablero incorporado que le permite monitorear sus trabajos. Le ofrece una visión general de todos sus trabajos en segundo plano y puede observar el estado de cada trabajo en detalle.
- Distribuido: como la lambda o el trabajo en segundo plano se serializa en el almacenamiento persistente, el proceso en segundo plano puede viajar a través de los límites de la JVM y esto permite el procesamiento distribuido. ¿Necesitas procesar 1.000.000 de trabajos en segundo plano? Añada temporalmente servidores de trabajos en segundo plano adicionales – digamos 10 – que puedan procesar estos trabajos y su tiempo total de procesamiento se dividirá por casi 10.
- Auto-mantenible: no necesita realizar una limpieza manual del almacenamiento – JobRunr lo mantiene lo más limpio posible y elimina los trabajos completados con éxito automáticamente.