I dag handlar allt hype om ramverk för distribuerad realtidsbearbetning, som Apache Hadoop, Apache Kafka eller Apache Spark. Dessa ramverk är väletablerade och en nödvändighet om du är ett företag som Facebook, Netflix eller LinkedIn, men de är inte riktigt utvecklarvänliga – inlärningskurvan är hög och att hantera infrastrukturen de körs på är inte en trivial uppgift.
Och låt oss inse det – vi arbetar inte alla för ett företag som de som nämnts ovan – som bearbetar terabyte av data varje dag.
Ofta behöver vi bara lösa några komplexa affärsprocesser med en måttlig mängd data. Själv måste jag fortfarande träffa min första kund som har mer än en terabyte relevant data inom samma affärsprocess.
Vad jag behövde göra – redan ett par gånger – är att göra några riktigt svåra beräkningar på flera gigabyte data. Och för dessa typer av beräkningar hittade jag aldrig det rätta Java-ramverket som kunde hjälpa mig att få jobbet gjort på ett tillförlitligt sätt och med ren kod.
Ja, det finns Spring Batch (definitivt inte min favorit) eller Quartz, men alla dessa ramverk gör att du måste implementera anpassade gränssnitt och de lägger till en hel del overhead när jag bara vill köra några långvariga uppgifter i bakgrunden.
Så, presentera JobRunr.io!
JobRunr gör det möjligt att skapa bakgrundsjobb genom att bara använda lambdaer i Java 8! Ett exempel:
BackgroundJob.enqueue(() -> myService.doWork());
Denna kodrad ser till att lambda – inklusive typ, metod och argument – serialiseras till beständig lagring (en RDBMS som Oracle, Postgres, MySql och MariaDB eller en NoSQL-databas som kommer att stödjas snart). En dedikerad arbetspool med trådar kommer sedan att utföra dessa bakgrundsjobb i kö så snart som möjligt.
Behövs det schemaläggas ett bakgrundsjobb imorgon? Nästa vecka? Nästa månad? JobRunr har allt du behöver:
BackgroundJob.schedule(() -> System.out.println("Reliable!"), now().plusHours(5));
Även återkommande jobb har aldrig varit enklare – JobRunr gör det möjligt att utföra alla typer av återkommande uppgifter med hjälp av CRON-uttryck.
BackgroundJob.scheduleRecurringly(() -> service.doWork(), Cron.daily());
Fördelarna:
- Enkelt: du behöver inte lära dig något nytt ramverk – du behöver bara använda dina befintliga kunskaper i Java 8.
- Enkelt: Eftersom du inte behöver implementera särskilda gränssnitt eller utöka abstrakta klasser är din kod nästan agnostisk i förhållande till JobRunr. Du kan återanvända dina befintliga tjänster utan några ändringar.
- Feltolerant: Det händer dåliga saker – en tjänst som du använder kan vara nere, diskarna kan bli fulla, SSL-certifikat löper ut, … . Om JobRunr stöter på ett undantag kommer den som standard att planera om bakgrundsjobbet med en exponentiell policy för avstängning. Om bakgrundsjobbet fortsätter att misslyckas tio gånger kommer det att gå till
Failed
. Du kan sedan besluta att ställa in det misslyckade jobbet på nytt när grundorsaken har lösts. - Transparent: JobRunr innehåller en inbyggd instrumentpanel som gör att du kan övervaka dina jobb. Den ger dig en översikt över alla dina bakgrundsjobb och du kan observera tillståndet för varje jobb i detalj.
- Distribuerad: Eftersom lambda- eller bakgrundsjobbet serialiseras till persistent lagring kan bakgrundsprocessen resa över JVM-gränser och detta möjliggör distribuerad bearbetning. Behöver du bearbeta 1 000 000 000 bakgrundsjobb? Lägg tillfälligt till extra servrar för bakgrundsjobb – låt oss säga 10 – som kan bearbeta dessa jobb och din totala bearbetningstid kommer att delas med nästan 10.
- Självunderhållbar: Du behöver inte utföra manuell rensning av lagret – JobRunr håller det så rent som möjligt och tar bort framgångsrikt avslutade jobb automatiskt.