Heute dreht sich alles um die verteilten Echtzeit-Verarbeitungs-Frameworks wie Apache Hadoop, Apache Kafka oder Apache Spark. Diese Frameworks sind gut etabliert und eine Notwendigkeit für Unternehmen wie Facebook, Netflix oder LinkedIn, aber sie sind nicht wirklich entwicklerfreundlich – die Lernkurve ist hoch und die Verwaltung der Infrastruktur, auf der sie laufen, ist keine triviale Aufgabe.
Und, seien wir ehrlich – wir arbeiten nicht alle für ein Unternehmen wie die oben genannten, die täglich Terabytes an Daten verarbeiten.
Oft müssen wir nur einige komplexe Geschäftsprozesse mit einer moderaten Datenmenge lösen. Ich selbst muss noch meinen ersten Kunden kennenlernen, der mehr als ein Terabyte relevanter Daten innerhalb desselben Geschäftsprozesses hat.
Was ich schon ein paar Mal tun musste, ist, einige wirklich schwierige Berechnungen mit mehreren Gigabyte Daten durchzuführen. Und für diese Art von Berechnungen habe ich nie das richtige Java-Framework gefunden, das mir hilft, die Aufgabe zuverlässig und mit sauberem Code zu erledigen.
Ja, es gibt Spring Batch (definitiv nicht mein Favorit) oder Quartz, aber diese Frameworks zwingen einen dazu, benutzerdefinierte Schnittstellen zu implementieren, und sie fügen eine Menge Overhead hinzu, während ich einfach nur einige langlaufende Aufgaben im Hintergrund ausführen möchte.
So, ich präsentiere JobRunr.io!
JobRunr ermöglicht es Ihnen, Hintergrundaufgaben nur mit Java 8 Lambdas zu erstellen! Ein Beispiel:
BackgroundJob.enqueue(() -> myService.doWork());
Diese eine Codezeile sorgt dafür, dass das Lambda – einschließlich Typ, Methode und Argumente – in einen persistenten Speicher serialisiert wird (ein RDBMS wie Oracle, Postgres, MySql und MariaDB oder eine NoSQL-Datenbank, die bald unterstützt wird). Ein dedizierter Worker-Pool von Threads führt dann diese in der Warteschlange stehenden Hintergrundaufträge so schnell wie möglich aus.
Müssen Sie morgen einen Hintergrundauftrag planen? Nächste Woche? Nächsten Monat? Mit JobRunr sind Sie auf der sicheren Seite:
BackgroundJob.schedule(() -> System.out.println("Reliable!"), now().plusHours(5));
Auch wiederkehrende Aufgaben waren noch nie so einfach – JobRunr ermöglicht es, jede Art von wiederkehrenden Aufgaben mit CRON-Ausdrücken auszuführen.
BackgroundJob.scheduleRecurringly(() -> service.doWork(), Cron.daily());
Die Vorteile:
- Einfach: Sie müssen kein neues Framework erlernen – nutzen Sie einfach Ihre vorhandenen Java 8 Kenntnisse.
- Einfach: Da Sie keine speziellen Schnittstellen implementieren oder abstrakte Klassen erweitern müssen, ist Ihr Code fast unabhängig von JobRunr. Sie können Ihre bestehenden Dienste ohne Änderungen wiederverwenden.
- Fehlertolerant: Schlimme Dinge passieren – ein von Ihnen genutzter Dienst kann ausfallen, Festplatten können voll werden, SSL-Zertifikate laufen ab, … . Wenn JobRunr auf eine Ausnahme stößt, wird der Hintergrundjob standardmäßig mit einer exponentiellen Backoff-Politik neu geplant. Wenn der Hintergrundjob zehnmal fehlschlägt, geht er in den Zustand
Failed
über. Sie können dann entscheiden, den fehlgeschlagenen Job erneut in die Warteschlange zu stellen, wenn die Ursache behoben wurde. - Transparent: JobRunr enthält ein eingebautes Dashboard, mit dem Sie Ihre Jobs überwachen können. Es gibt Ihnen einen Überblick über alle Ihre Hintergrundjobs und Sie können den Zustand jedes Jobs im Detail beobachten.
- Verteilt: Da der Lambda- oder Hintergrundjob in einen persistenten Speicher serialisiert wird, kann der Hintergrundprozess über JVM-Grenzen hinweg laufen und dies ermöglicht eine verteilte Verarbeitung. Müssen Sie 1.000.000 Hintergrundaufträge verarbeiten? Fügen Sie vorübergehend zusätzliche Hintergrundjobserver hinzu – sagen wir 10 -, die diese Jobs verarbeiten können, und Ihre Gesamtverarbeitungszeit wird durch fast 10 geteilt.
- Selbstwartbar: Sie müssen keine manuelle Speicherbereinigung durchführen – JobRunr hält ihn so sauber wie möglich und entfernt erfolgreich abgeschlossene Jobs automatisch.