Preskoči na sadržaj
Datasoft

Django i razvoj

Django, Celery i Redis: automatizacija zadataka u pozadini

Kako izdvojiti spore procese iz HTTP zahtjeva pomoću Celery radnika i brokera poruka.

Datasoft · · 4 min čitanjaAžurirano:

Korisnik je poslao obrazac, a web aplikacija sada treba generirati PDF, poslati e-poštu i obraditi veliku datoteku. Ako se sve to izvršava unutar jednog HTTP zahtjeva, korisnik nepotrebno čeka, a zahtjev može isteći. Django može izdvojiti takav rad u pozadinu, a Celery je jedan od često korištenih alata za organizaciju tih zadataka.

Što se mijenja s pozadinskim zadacima?

Umjesto da aplikacija tijekom HTTP zahtjeva čeka završetak sporog posla, ona može zabilježiti zahtjev i staviti poruku u red. Celery worker preuzima zadatak i obrađuje ga odvojeno. Redis može biti broker poruka, a za određene scenarije i spremište rezultata. Treba razlikovati ulogu brokera od trajne baze poslovnih podataka.

Primjer: nakon potvrde rezervacije aplikacija spremi podatke i pošalje zadatak za slanje potvrde e-poštom. Korisnik brzo dobiva odgovor, a slanje se može ponovno pokušati ako privremeno zakaže vanjski mail servis.

Minimalan primjer zadatka

from celery import shared_task
from django.core.mail import send_mail

@shared_task(autoretry_for=(Exception,), retry_backoff=True, max_retries=3)
def posalji_potvrdu(adresa, tekst):
    send_mail("Potvrda", tekst, "no-reply@example.com", [adresa])

Ovo je pojednostavljen primjer: domena pošiljatelja, slanje i ponovni pokušaji u stvarnoj aplikaciji traže provjeru konfiguracije i pravilno rukovanje greškama. Široki Exception u primjeru može ponavljati i trajne pogreške, zato se u produkciji obično biraju samo prolazne iznimke koje imaju smisla za retry.

Najteži dio nije pokretanje workera

Pozadinski zadaci mogu se izvršiti više puta, primjerice nakon prekida veze ili ponovnog pokušaja. Zato treba projektirati idempotentnost: ponavljanje iste poruke ne smije stvoriti dvije narudžbe ili dvaput naplatiti korisnika. Za slanje obavijesti korisno je bilježiti stanje slanja i jedinstveni identifikator događaja.

Zadaci pokrenuti nakon promjene baze trebaju vidjeti potvrđene podatke. Za to koristite transaction.on_commit() ili odgovarajući integracijski obrazac. Inače worker može krenuti prije nego što je transakcija završila.

Operativna strana sustava

Celery worker treba nadzor, restart politiku i ograničenja resursa. Pratite duljinu reda, starost poruka, neuspjele zadatke i trajanje obrade. Odvojite dugotrajne zadatke od kratkih ako jedan veliki posao može blokirati važne obavijesti. Definirajte što će se dogoditi ako broker ili worker privremeno nisu dostupni.

Nemojte u poruke nepotrebno kopirati osobne podatke; često je dovoljno poslati ID zapisa pa podatke dohvatiti sigurno na strani workera.

Kada koristiti Celery?

Za e-poštu, generiranje izvještaja, uvoz većih datoteka, periodične zadatke i integracije Celery može biti odličan izbor. Za vrlo mali sustav s povremenim jednostavnim zadatkom možda je dovoljno skromnije rješenje. Cilj nije dodati još jedan servis nego smanjiti čekanje korisnika i pouzdano obraditi posao izvan web zahtjeva.

Primjer automatizacije koja stvarno štedi vrijeme

U ustanovi se nakon prijave na događaj šalje e-mail s potvrdom i generira PDF dokument. Ako sve obavlja HTTP zahtjev, korisnik može čekati na spor servis slanja pošte. Kada se posao razdvoji, aplikacija odmah potvrđuje uspješno spremljenu prijavu, a worker u pozadini obavlja slanje. Sustav pritom mora jasno zabilježiti je li poruka poslana ili će se ponoviti pokušaj. Ne smije se dogoditi da korisnik dobije dvije prijave zbog ponavljanja istog zadatka.

Kod planiranih zadataka, primjerice dnevnog izvještaja, treba odrediti vremensku zonu, ponašanje kod propuštenog izvršavanja i način sprječavanja paralelnih duplikata. Automatizacija bez nadzora može tiho prestati raditi.

Česta pitanja

Treba li Celery svakoj Django aplikaciji? Ne. Ako nema sporih ili periodičnih zadataka, dodatna infrastruktura može biti nepotrebna.

Je li Redis trajna baza podataka? U ovom obrascu često služi kao broker, a ne kao jedini izvor poslovnih podataka.

Kako korisnik zna da je posao gotov? Možete spremati status zadatka i prikazivati ga kroz aplikaciju ili poslati obavijest nakon uspješne obrade.

Kontrolna lista za pozadinske zadatke

Celery nije samo red poruka, nego dio poslovnog sustava koji mora podnijeti ponavljanja, prekide i djelomične pogreške. To je posebno važno za izvoz dokumenata, slanje potvrda i povezivanje s vanjskim aplikacijama. Prije uvođenja odlučite što korisnik vidi dok posao traje i što se događa kada servis nekoliko sati nije dostupan.

  • Je li zadatak dovoljno spor ili nepredvidljiv da ga treba izdvojiti iz običnog HTTP zahtjeva?
  • Može li ponovljeno izvršavanje proizvesti duplikat računa, rezervacije ili druge nepovratne poslovne radnje?
  • Jesu li podaci spremljeni i transakcija završena prije nego što worker počne čitati novi zapis?
  • Tko prati red poruka, neuspjele zadatke, broj ponovnih pokušaja i trajanje obrade pojedine vrste posla?
  • Jesu li osobni i osjetljivi podaci izostavljeni iz poruka kada je moguće poslati samo siguran identifikator zapisa?
  • Postoji li jasan postupak ponovnog pokretanja radnika ili obrade zaostalih poruka nakon prekida brokera?

Pouzdan pozadinski rad korisniku izgleda jednostavno upravo zato što je iza njega jasna kontrola stanja.

Povezani članci

Imate sličan izazov?

Recite nam što želite unaprijediti u svom poslovanju.

Kontaktirajte Datasoft