Beheer en automatiseer background tasks met Hangfire

Technologie

Beheer en automatiseer background tasks met Hangfire

Een background task is een type taak dat op de achtergrond draait. Soms voeren we in een systeem een taak uit die lang duurt. Dan starten we een nieuwe taak op de achtergrond om efficiënter te werken. In programming code moeten we bijvoorbeeld soms inloggen op een pagina en na een paar processen een e-mail naar de klant sturen. We kunnen het proces van het verzenden van de e-mail op de achtergrond uitvoeren en doorgaan met het onafgemaakte proces. Het verzenden van de e-mail is in dit geval een achtergrondtaak.

Waarom hebben we achtergrondtaken nodig?

Achtergrondtaken zijn belangrijk wanneer je een actie moet uitvoeren die lang duurt om te voltooien, of waar een gebruiker niet op hoeft te wachten. Zonder de achtergrondtaak moeten we beide acties één voor één uitvoeren en de reactie kan ook langer duren om de gebruiker te bereiken. Met de achtergrondtaak kun je de taak op de achtergrond laten uitvoeren en de gebruiker sneller een reactie geven, wat zorgt voor een betere gebruikerservaring.

RL 02809

Wat is Hangfire?

Hangfire is een open-source framework. Het helpt bij het creëren van een nieuw proces en het beheren van de achtergrondtaak. De achtergrondtaak wordt ook wel de Background job genoemd. Hangfire helpt ons om achtergrondtaken te beheren. Je kunt met Hangfire veel verschillende soorten jobs uitvoeren. Enkele hiervan zijn:

  • Fire-and-forget (Enqueue)
  • Vertraagde jobs (Schedule)
  • Recurring jobs (Recurring Job)
  • Vervolg van andere jobs

De achtergrondjobs worden opgeslagen op de door jou gekozen locatie. Hangfire ondersteunt veel verschillende opslagmethoden, gebaseerd op documenten en relationele databases.

Hangfire heeft zijn eigen automatische retry-logica die de jobs opnieuw probeert uit te voeren en te voltooien. Zo hoef je je geen zorgen te maken over fouten die door de jobs worden gegenereerd. Het gebruikt ‘workers’ om de taken af te handelen. Je definieert het aantal workers en één of meer verschillende queues. Per worker kun je instellen welke queues zij behandelen. Meerdere workers kunnen dezelfde queue behandelen. Afwerking gebeurt dan op basis van "first-come, first-serve". Zo kun je dus configureren hoeveel verschillende taken tegelijk uitgevoerd kunnen worden.

Een andere fijne toevoeging is dat Hangfire out-of-the-box een dashboard meelevert, tegenover de ‘standaard’ manier van achtergrondtaak implementatie in .NET. Hierin kun je live zien welke taken er lopen, hoe lang ze al lopen, of er taken in de wachtrij staan en wat er mis is gegaan met eerdere taken. Ook kun je vanaf dit dashboard taken starten.  Dit dashboard valt af te schermen zodat alleen specifieke gebruikers hierbij kunnen.

Hoe werkt het?

We nemen een systeem dat Orders verwerkt, en daarna een Shipment aanmaakt.


Wellicht gebeurt het shippen van de order door een externe partij en duurt het een tijdje voordat een shipment daar verwerkt is. Voor jouw systeem is het alleen belangrijk te laten weten dat de bestelling geplaatst is en mag de shipment ondertussen op de achtergrond geregeld worden.

In dat geval kunnen we de ShipOrder methode als BackgroundJob enqueuen. Nu wordt, in plaats van het uitvoeren van de actie, de actie alleen geregistreerd op het Hangfire server component, en kan je HTTP-request meteen een status teruggeven.

De task wordt nu opgepakt door de HangFire Task Scheduler na het volgende polling interval. De code verandert naar onderstaand.

 

Nu blijkt dat gebruikers vaak nog tijd willen om hun bestelling te annuleren. Daarom willen we ons systeem zo aanpassen dat de shipment van een verwerkte order pas na een uur wordt verwerkt.

Dit kunnen we doen door de Schedule methode te gebruiken in plaats van de Enqueue methode. Hoewel beide methoden vergelijkbaar werken, geeft Schedule de taskscheduler expliciet de instructie om de taak nog niet direct uit te voeren.

Intussen is ons systeem dermate gegroeid dat we orders gaan batchen richting de partij die de shipments verwerkt. Daarom willen we een proces inrichten dat ieder uur draait.

Het definiëren van ons herhalend proces, doen we bij het opstarten van onze applicatie.


Vervolgens richten we de ‘ScheduleBackgroundJobs’ methode van onze Scheduler zo in, dat we ieder uur op het hele uur de ProcessShipments methode aanroepen.


De terugkerende ProcessShipment taak is nu ook in het dashboard terug te zien en kan hier vaker worden gedraaid, mocht dit nodig zijn.

Hiermee hebben we drie functionaliteiten behandeld:

  •         Het direct starten van het asynchroon verwerken van een enkele job (Enqueue)
  •         Het uitstellen van het starten van het verwerken van een enkele job (Schedule)
  •         Het inplannen van het verwerken van een terugkerende job (Recurring Job)

Conclusie

Hangfire is een krachtig open-source framework dat helpt bij het beheren en automatiseren van achtergrondtaken. Door gebruik te maken van verschillende soorten jobs zoals Enqueueing, Scheduling en Recurring jobs, kunnen we taken op de achtergrond uitvoeren, wat zorgt voor een snellere respons en een betere gebruikerservaring. Met de ingebouwde retry-logica biedt Hangfire een goede oplossing voor het afhandelen van langdurige en complexe processen.

Rlxgaransys 2 0057 Michiel

Meer weten? Neem contact op!

Michiel Leenaers

Business Development
0614688177
m.leenaers@garansys.nl