Bralci, kot ste vi, pomagajo podpirati MUO. Ko opravite nakup prek povezav na našem spletnem mestu, lahko zaslužimo partnersko provizijo. Preberi več.

Kot spletni razvijalec je ključnega pomena, da vaše aplikacije delujejo čim hitreje. Izdelati morate spletne aplikacije, ki se odzivajo na zahteve v najkrajšem možnem času.

Ena od mnogih tehnologij, ki vam lahko pomagajo, je čakalna vrsta opravil.

Torej, kaj je čakalna vrsta opravil in kako jo lahko uporabite za optimizacijo aplikacije Node.js?

Kaj je čakalna vrsta opravil?

Čakalna vrsta sporočil je sredstvo za asinhrono komunikacijo med dvema aplikacijama ali storitvama, ki se običajno imenuje producent in potrošnik. To je dobro znan koncept, ki se uporablja v arhitekturah brez strežnikov in mikrostoritev.

Koncept naloga oz službačakanje v čakalni vrsti izkorišča čakalno vrsto sporočil za izboljšanje delovanja aplikacije. Abstrahira zapletenost upravljanja sporočil in vam omogoča, da definirate funkcije za asinhrono upravljanje opravil ali opravil z uporabo čakalne vrste, s čimer zmanjšate stopnjo

instagram viewer
uporaba pomnilnika v nekaterih delih aplikacije.

Najpogostejši primer programske opreme za čakalno vrsto sporočil je RabbitMQ. Orodja za čakalno vrsto opravil vključujejo Celery in Bull. RabbitMQ lahko konfigurirate tudi tako, da deluje kot čakalna vrsta opravil. Berite naprej, če želite izvedeti več o čakalnih vrstah opravil v Node.js z uporabo Bulla.

Kaj je BullMQ?

BullMQ (Bull.js) je knjižnica Node.js, ki se uporablja za implementacijo čakalnih vrst v aplikacijah Node. Bull je sistem, ki temelji na Redisu (morda ste bolj seznanjeni z Redisom kot orodjem za hitro shranjevanje podatkov) in je hitra in zanesljiva možnost, ki jo je treba upoštevati za čakalno vrsto opravil v Node.js.

Bull lahko uporabljate za številna opravila, kot je izvajanje odloženih opravil, načrtovanih opravil, ponovljivih opravil, prednostnih čakalnih vrst in še veliko več.

Torej, kako lahko uporabite Bull in Redis za asinhrono izvajanje nalog Node.js?

Kako konfigurirati Bull in Redis za čakalno vrsto opravil v Node.js

Če želite začeti s čakalno vrsto opravil v Node.js z Bull, morate na svojem računalniku namestiti Node.js in Redis. Lahko sledite Redis laboratorijski vodnik za namestitev Redisa če ga nimate nameščenega.

Prvi korak k uvedbi Bulla je, da ga z zagonom dodate odvisnostim vašega projekta npm namestite bull oz preje dodajte bik v terminalu v mapi vašega projekta. Obstaja več načinov za inicializacijo čakalne vrste v Bull, kot je prikazano spodaj:

konst Čakalna vrsta = zahtevati('bik');

// različni načini inicializacije čakalne vrste
// - z uporabo redis URL niza
konst emailQueue = novo Čakalna vrsta ('E-poštna vrsta', 'redis://127.0.0.1:6379');

// - s povezavo redis in objektom možnosti čakalne vrste
konst videoČakalna vrsta = novo Čakalna vrsta ('Čakalna vrsta videoposnetkov', 'redis://127.0.0.1:6379', queueOptions);

// - brez povezave redis, vendar s queueOption
konst docQueue = novo Čakalna vrsta ('Čakalna vrsta dokumentov', queueOptions);

// - brez povezave redis ali možnosti čakalne vrste
konst QueueClient = novo Čakalna vrsta ('Moja čakalna vrsta');

Vsi ti uporabljajo minimalno konfiguracijo za Bull v Node.js. Objekt možnosti podpira številne lastnosti in o njih lahko izveste v razdelek možnosti čakalne vrste v Bullovi dokumentaciji.

Implementacija e-poštne čakalne vrste opravil z uporabo BullMQ

Če želite implementirati čakalno vrsto za pošiljanje e-poštnih sporočil, lahko definirate svojo funkcijo proizvajalca, ki dodaja e-poštna sporočila v čakalno vrsto e-pošte, in funkcijo potrošnika za upravljanje pošiljanja e-poštnih sporočil.

Prvič, svojo čakalno vrsto lahko inicializirate v razredu z URL-jem Redis in nekaterimi možnostmi čakalne vrste, kot je prikazano spodaj.

// queueHandler.js
konst Čakalna vrsta = zahtevati('bik');

// tukaj uporabite pravi modul za obravnavo e-pošte - to je samo primer
konst emailHandler = zahtevati('./emailHandler.js');

// definirajte konstante, Redis URL in možnosti čakalne vrste
konst REDIS_URL = 'redis://127.0.0.1:6379';

konst queueOpts = {
// možnosti omejevalnika hitrosti, da preprečite preobremenitev čakalne vrste
omejevalnik: {
// največje število opravil, ki jih lahko sprejme čakalna vrsta
max: 100,

// čas čakanja v milisekundah pred sprejetjem novih opravil
// doseganje meje
trajanje: 10000
},
predpona: 'EMAIL-TASK', // predpona, ki bo dodana vsem ključem čakalne vrste
defaultJobOptions: { // privzete možnosti za opravila v čakalni vrsti
poskusi: 3, // privzeto število ponovnih poskusov opravila

// za odstranitev opravila iz čakalne vrste po zaključku
removeOnComplete: prav
}
};

razredEmailQueue{
konstruktor() {
to.queue = novo Čakalna vrsta ('E-poštna vrsta', REDIS_URL, queueOpts);
}
};

izvozprivzeto EmailQueue; // izvozi razred

Zdaj, ko ste inicializirali čakalno vrsto, lahko definirate svojo producentsko funkcijo (z uporabo Bullove dodaj() funkcija) kot metoda za EmailQueue razred za dodajanje e-poštnih sporočil v čakalno vrsto opravil. Naslednji blok kode to prikazuje:

// queueHandler.js

razredEmailQueue{
konstruktor () {
// ...
}

// funkcija proizvajalca za dodajanje e-poštnih sporočil v čakalno vrsto
asinh addEmailToQueue (emailData) {
// dodaj opravilo z imenom 'email_notification' v čakalno vrsto
čakatito.queue.add('email_notification', emailData);
konzola.log('e-pošta je bila dodana v čakalno vrsto ...');
}
};

izvozprivzeto EmailQueue; // izvozi razred

Funkcija proizvajalca je pripravljena in zdaj lahko definirate funkcijo potrošnika (z uporabo Bull's proces() funkcija) za obdelavo vseh e-poštnih opravil v čakalni vrsti – tj. pokličite funkcijo za pošiljanje e-pošte. To potrošniško funkcijo bi morali definirati v konstruktorju razreda.

// queueHandler.js
razredEmailQueue{
konstruktor () {
// ...

// potrošniška funkcija, ki sprejme dodeljeno ime naloge in
// funkcija povratnega klica
to.queue.process('email_notification', asinh (emailJob, done) => {
konzola.log('obdelava e-poštnega obvestila');
čakati emailHandler.sendEmail (emailJob); // pošlji e-pošto
Končano(); // dokončaj nalogo
})
}
// ...
};

izvozprivzeto EmailQueue; // izvozi razred

Opravilo ima lahko tudi možnosti za definiranje svojega vedenja v čakalni vrsti ali kako ga obravnava potrošniška funkcija. Več o tem lahko izveste v razdelek z možnostmi zaposlitve v Bullovi dokumentaciji.

The emailJob argument je objekt, ki vsebuje lastnosti naloge za obdelavo v čakalni vrsti. Vključuje tudi glavne podatke, potrebne za sestavo e-pošte. Za lažje razumevanje, Pošlji sporočilo() funkcija bi bila podobna temu primeru:

// emailHandler.js
konst sendgridMail = zahtevati('@sendgrid/mail');

konst apiKey = process.env. SENDGRID_API_KEY

sendgridMail.setApiKey (apiKey); // nastavi varnostne poverilnice prenosnika e-pošte

konst pošlji e-pošto = asinh (emailJob) => {
poskusi {
// ekstrahiraj e-poštne podatke iz opravila
konst { ime, e-pošta } = emailJob.data;

konst sporočilo = {
od: '[email protected]',
za: '[email protected]',
predmet: 'Živjo! dobrodošli',
besedilo: `Pozdravljeni ${name}, dobrodošli v MUO`
};

čakati sendgridMail.sendMail (sporočilo); // Pošlji sporočilo

// označi nalogo kot dokončano v čakalni vrsti
čakati emailJob.moveToCompleted('Končano', prav);
konzola.log('E-pošta je bila uspešno poslana ...');
} ulov (napaka) {
// premakni opravilo med neuspela opravila
čakati emailJob.moveToFailed({ sporočilo: 'obdelava opravila ni uspela..' });
konzola.error (napaka); // zabeleži napako
}
}

izvozprivzeto Pošlji sporočilo;

Zdaj, ko imate obe funkciji proizvajalca in potrošnika definirani in pripravljeni za uporabo, lahko pokličete svojo funkcijo proizvajalca kjer koli v svoji aplikaciji, da dodate e-pošto v čakalno vrsto za obdelavo.

Primer krmilnika bi izgledal takole:

// userController.js
konst EmailQueue = zahtevati('../handlers/queueHandler.js')

konst prijava = asinh (req, res) => {
konst { ime, e-pošta, geslo } = req.body;

// --
// poizvedba za dodajanje novega uporabnika v zbirko podatkov ...
// --

// dodaj v čakalno vrsto e-pošte
konst emailData = {ime, email};
čakati EmailQueue.addEmailToQueue (emailData);

res.status(200).json({
sporočilo: "Prijava je bila uspešna, preverite svojo e-pošto"
})
}

Vaš queueHandler.js datoteka bi morala biti zdaj naslednja:

// queueHandler.js
konst Čakalna vrsta = zahtevati('bik');
konst emailHandler = zahtevati('../handlers/emailHandler.js');

konst REDIS_URL = 'redis://127.0.0.1:6379';

konst queueOpts = {
omejevalnik: {
max: 100,
trajanje: 10000
},

predpona: 'EMAIL-TASK',

defaultJobOptions: {
poskusi: 3,
removeOnComplete: prav
}
};

razredEmailQueue{
konstruktor() {
to.queue = novo Čakalna vrsta ('E-poštna vrsta', REDIS_URL, queueOpts);

// potrošnik
to.queue.process('email_notification', asinh (emailJob, done) => {
konzola.log('obdelava e-poštnega obvestila');
čakati emailHandler.sendEmail (emailJob);
Končano();
})
}

// proizvajalec
asinh addEmailToQueue (emailData) {
// dodaj opravilo z imenom 'email_notification' v čakalno vrsto
čakatito.queue.add('email_notification', emailData);
konzola.log('e-pošta je bila dodana v čakalno vrsto ...');
}
};

izvozprivzeto EmailQueue;

Ko to implementirate v API-ju REST Node.js, boste opazili krajši odzivni čas končne točke prijave in hitrejše čase dostave e-pošte v primerjavi z alternativo.

Čakalne vrste opravil so vam omogočile tudi neodvisno obravnavanje napak pri prijavi in ​​e-pošte.

Optimiziranje aplikacij z uporabo čakalnih vrst opravil

Čakalne vrste sporočil in opravil so odličen način za izboljšanje splošne učinkovitosti aplikacij. Prav tako so zelo poceni in jih lahko uporabite v toliko delih aplikacije, kot jih potrebujete.

Čeprav je ta vadnica uporabila e-poštna sporočila kot primer scenarija za obravnavanje nalog, ki porabljajo pomnilnik, s čakalnimi vrstami, obstaja veliko drugih primerov, kjer lahko uporabite iste koncepte. Ti vključujejo težke operacije branja/pisanja, upodabljanje visokokakovostnih slik ali dokumentov in pošiljanje množičnih obvestil.