Most minden hype az olyan elosztott valós idejű feldolgozó keretrendszerek körül forog, mint az Apache Hadoop, az Apache Kafka vagy az Apache Spark. Ezek a keretrendszerek jól beváltak, és szükségszerűek, ha olyan vállalat vagyunk, mint a Facebook, a Netflix vagy a LinkedIn, de nem igazán fejlesztőbarátok – a tanulási görbe magas, és a rajtuk futó infrastruktúra kezelése nem triviális feladat.
És lássuk be, nem mindannyian dolgozunk olyan vállalatnál, mint a fent említettek – amelyek naponta terabájtnyi adatot dolgoznak fel.
Gyakran csak néhány komplex üzleti folyamatot kell megoldanunk mérsékelt adatmennyiséggel. Nekem magamnak még találkoznom kell az első olyan ügyfelemmel, akinek egy üzleti folyamaton belül több mint egy terabájtnyi releváns adata van.
Amit viszont meg kellett tennem – már néhányszor -, az az, hogy néhány igazán nehéz számítást végezzek több gigabájtnyi adaton. És az ilyen típusú számításokhoz soha nem találtam megfelelő Java keretrendszert, amely segített volna abban, hogy a munkát megbízhatóan és tiszta kóddal végezzem el.
Igen, ott van a Spring Batch (határozottan nem a kedvencem) vagy a Quartz, de ezek a keretrendszerek mind egyedi interfészek implementálására kényszerítenek, és rengeteg overheadet adnak hozzá, miközben én csak néhány hosszú futású feladatot szeretnék futtatni a háttérben.
Szóval, bemutatom a JobRunr.io-t!
A JobRunr lehetővé teszi, hogy háttérmunkákat hozzunk létre csak Java 8 lambdák segítségével! Egy példa:
BackgroundJob.enqueue(() -> myService.doWork());
Ez az egy sornyi kód gondoskodik arról, hogy a lambda – beleértve a típust, a metódust és az argumentumokat – szerializálva legyen a tartós tárolóba (egy RDBMS-be, mint az Oracle, Postgres, MySql és MariaDB, vagy egy NoSQL adatbázisba, amely hamarosan támogatott lesz). A szálak dedikált munkáskészlete ezután a lehető leghamarabb végrehajtja ezeket a sorba állított háttérmunkákat.
Háttérmunkákat kell ütemeznie holnapra? Jövő héten? A következő hónapban? A JobRunr gondoskodik róla:
BackgroundJob.schedule(() -> System.out.println("Reliable!"), now().plusHours(5));
Az ismétlődő feladatok még sosem voltak ilyen egyszerűek – a JobRunr lehetővé teszi bármilyen ismétlődő feladat elvégzését CRON-kifejezések segítségével.
BackgroundJob.scheduleRecurringly(() -> service.doWork(), Cron.daily());
Az előnyök:
- Egyszerű: nem kell új keretrendszert tanulni – csak használja a meglévő Java 8-as ismereteit.
- Egyszerű: mivel nem kell speciális interfészeket implementálnia vagy absztrakt osztályokat bővítenie, a kódja szinte teljesen független a JobRunr-tól. Meglévő szolgáltatásait változtatás nélkül újra felhasználhatja.
- Hibatűrő: Rossz dolgok történnek – egy általad használt szolgáltatás leállhat, a lemezek megtelhetnek, az SSL tanúsítványok lejárhatnak, … . Ha a JobRunr kivétellel találkozik, alapértelmezés szerint átütemezi a háttérmunkát egy exponenciális visszalépési irányelvvel. Ha a háttérfeladat továbbra is tízszer hibázik, akkor a
Failed
állapotba kerül. Ezután dönthet úgy, hogy a sikertelen feladatot újra sorba állítja, ha a kiváltó okot megoldotta. - Átlátszó: A JobRunr tartalmaz egy beépített műszerfalat, amely lehetővé teszi a munkák felügyeletét. Ez áttekintést ad az összes háttérmunkájáról, és részletesen megfigyelheti az egyes munkák állapotát.
- Elosztott: Mivel a lambda- vagy háttérmunkát a tartós tárolóba szerializálják, a háttérfolyamat a JVM-határokat is átlépheti, és ez lehetővé teszi az elosztott feldolgozást. Szüksége van 1.000.000 háttérmunkát feldolgozni? Ideiglenesen adjon hozzá extra háttérmunkaszervereket – mondjuk 10-et -, amelyek képesek feldolgozni ezeket a munkákat, és a teljes feldolgozási idő majdnem 10-zel oszlik.
- Önkarbantartó: nem kell manuálisan elvégeznie a tároló takarítását – a JobRunr a lehető legtisztábban tartja azt, és automatikusan eltávolítja a sikeresen befejezett munkákat.