Tokie skaitytojai kaip jūs padeda palaikyti MUO. Kai perkate naudodami nuorodas mūsų svetainėje, galime uždirbti filialų komisinius. Skaityti daugiau.

Kadangi esate žiniatinklio kūrėjas, labai svarbu, kad jūsų programos veiktų kuo greičiau. Turėtumėte sukurti žiniatinklio programas, kurios kuo greičiau atsakytų į užklausas.

Viena iš daugelio technologijų, galinčių jums padėti, yra užduočių eilės sudarymas.

Taigi, kas yra užduočių eilės sudarymas ir kaip galite ją naudoti norėdami optimizuoti Node.js programą?

Kas yra užduočių eilėje?

Pranešimų sudarymas eilėje yra asinchroninio ryšio tarp dviejų programų ar paslaugų priemonė, paprastai vadinama gamintojas ir vartotojas. Tai gerai žinoma koncepcija, naudojama be serverio ir mikro paslaugų architektūrose.

Sąvoka užduotis arba darbaseilėje išnaudoja pranešimų eilę, kad pagerintų programos našumą. Tai abstrahuoja pranešimų tvarkymo sudėtingumą ir leidžia apibrėžti funkcijas, skirtas tvarkyti užduotis ar užduotis asinchroniškai naudojant eilę, taip sumažinant pranešimų greitį. atminties naudojimas kai kuriose programos dalyse.

instagram viewer

Dažniausias pranešimų eilės programinės įrangos pavyzdys yra RabbitMQ. Užduočių eilės įrankiai apima „Selery“ ir „Bull“. Taip pat galite sukonfigūruoti RabbitMQ veikti kaip užduočių eilė. Skaitykite toliau, kad sužinotumėte apie užduočių eilę Node.js naudojant Bull.

Kas yra BullMQ?

BullMQ (Bull.js) yra Node.js biblioteka, naudojama diegti eiles Node programose. „Bull“ yra „Redis“ pagrįsta sistema (galbūt geriau žinote „Redis“ kaip įrankį, skirtą greitas duomenų saugojimas) ir tai yra greita ir patikima parinktis, kurią reikia apsvarstyti nustatant užduočių eilę Node.js.

„Bull“ galite naudoti daugeliui užduočių, pvz., atidėtas užduotis, suplanuotas užduotis, kartojamas užduotis, prioritetines eiles ir daug daugiau.

Taigi, kaip naudoti „Bull“ ir „Redis“ Node.js užduotims vykdyti asinchroniškai?

Kaip sukonfigūruoti „Bull“ ir „Redis“ užduočių eilėms „Node.js“.

Norėdami pradėti kurti užduočių eilę Node.js su Bull, kompiuteryje turite įdiegti Node.js ir Redis. Galite sekti „Redis Labs“ vadovas, kaip įdiegti „Redis“. jei jo neįdiegėte.

Pirmasis „Bull“ diegimo žingsnis yra įtraukti jį į savo projekto priklausomybes paleidžiant npm įdiegti bull arba verpalai pridėti jautį terminale, esančiame jūsų projekto aplanke. Yra keli būdai, kaip inicijuoti eilę „Bull“, kaip parodyta toliau:

konst Eilė = reikalauti("jautis");

// skirtingi eilės inicijavimo būdai
// - naudojant redis URL eilutę
konst emailQueue = naujas Eilė(„El. pašto eilė“, „redis://127.0.0.1:6379“);

// - su redis ryšio ir eilės parinkčių objektu
konst videoQueue = naujas Eilė(„Vaizdo įrašų eilė“, „redis://127.0.0.1:6379“, eilėsOptions);

// - be redis ryšio, bet su queueOption
konst docQueue = naujas Eilė(„Dokumentų eilė“, eilėsOptions);

// - be pakartotinio ryšio ar eilės parinkčių
konst QueueClient = naujas Eilė(„Mano eilė“);

Visi jie naudoja minimalią Bull in Node.js konfigūraciją. Parinkčių objektas palaiko daugybę ypatybių ir apie jas galite sužinoti eilės parinkčių skyrių Bull dokumentacijoje.

El. pašto užduočių eilės įgyvendinimas naudojant BullMQ

Norėdami įdiegti el. laiškų siuntimo eilę, galite apibrėžti gamintojo funkciją, kuri prideda el. laiškus į el. pašto eilę, ir vartotojo funkciją el. laiškų siuntimui tvarkyti.

Pirma, galite inicijuoti savo eilę klasėje naudodami Redis URL ir kai kurias eilės parinktis, kaip parodyta toliau.

// queueHandler.js
konst Eilė = reikalauti("jautis");

// čia naudokite tikrą el. pašto tvarkyklės modulį – tai tik pavyzdys
konst emailHandler = reikalauti(„./emailHandler.js“);

// apibrėžkite konstantas, Redis URL ir eilės parinktis
konst REDIS_URL = „redis://127.0.0.1:6379“;

konst queueOpts = {
// greičio ribotuvo parinktys, kad būtų išvengta eilės perkrovimo
ribotuvas: {
// maksimalus užduočių skaičius, kurį gali užimti eilė
maks.: 100,

// laikas palaukti milisekundėmis prieš priimant naujus darbus po
// pasiekiant ribą
trukmė: 10000
},
priešdėlis: 'EL. PAŠTAS - UŽDUOTIS', // priešdėlis, kuris turi būti įtrauktas į visus eilės raktus
defaultJobOptions: { // numatytosios užduočių eilėje parinktys
bandymai: 3, // numatytasis kartų, kai reikia pakartoti užduotį, skaičius

// kad pašalintumėte užduotį iš eilės užbaigus
RemoveOnComplete: tiesa
}
};

klasėEmailQueue{
konstruktorius() {
tai.eilė = naujas Eilė(„El. pašto eilė“, REDIS_URL, queueOpts);
}
};

eksportuotinumatytas EmailQueue; // eksportuoti klasę

Dabar, kai inicijavote eilę, galite apibrėžti savo gamintojo funkciją (naudodami Bull's papildyti() funkcija) kaip metodas EmailQueue klasėje, kad įtrauktumėte el. laiškus į užduočių eilę. Tai rodo šis kodo blokas:

// queueHandler.js

klasėEmailQueue{
konstruktorius () {
// ...
}

// gamintojo funkcija, skirta įtraukti el. laiškus į eilę
async addEmailToQueue (emailData) {
// pridėti užduotį pavadinimu „email_notification“ į eilę
lauktitai.queue.add('email_notification', emailData);
konsolė.log('el. laiškas įtrauktas į eilę...');
}
};

eksportuotinumatytas EmailQueue; // eksportuoti klasę

Gamintojo funkcija yra paruošta ir dabar galite apibrėžti vartotojo funkciją (naudodami Bull's procesas () funkcija) apdoroti visas eilėje esančias el. pašto užduotis – t.y. paskambinkite funkcijai, kad išsiųstumėte el. laišką. Šią vartotojo funkciją turėtumėte apibrėžti klasės konstruktoriuje.

// queueHandler.js
klasėEmailQueue{
konstruktorius () {
// ...

// vartotojo funkcija, kuri perima priskirtą užduoties pavadinimą ir
// atgalinio skambinimo funkcija
tai.queue.process('email_notification', async (el. paštasDarbas, atliktas) => {
konsolė.log('apdorojama el. pašto pranešimų užduotis');
laukti emailHandler.sendEmail (emailJob); // išsiųsti laišką
padaryta(); // užbaigti užduotį
})
}
// ...
};

eksportuotinumatytas EmailQueue; // eksportuoti klasę

Darbas taip pat gali turėti parinkčių apibrėžti jos elgesį eilėje arba kaip vartotojo funkcija ją tvarko. Daugiau apie tai galite sužinoti „Bull“ dokumentacijos darbo parinkčių skyrius.

The paštasDarbas argumentas yra objektas, kuriame yra eilės apdoroti užduoties ypatybės. Jame taip pat yra pagrindiniai duomenys, reikalingi el. Kad būtų lengviau suprasti, Siųsti laišką() funkcija būtų panaši į šį pavyzdį:

// emailHandler.js
konst sendgridMail = reikalauti(„@sendgrid/mail“);

konst apiKey = process.env. SENDGRID_API_KEY

sendgridMail.setApiKey (apiKey); // nustatyti el. pašto transporterio saugos kredencialus

konst sendEmail = async (emailJob) => {
bandyti {
// ištraukite el. pašto duomenis iš darbo
konst {vardas, el.paštas} = el.paštasJob.duomenys;

konst žinutė = {
: '[email protected]',
į: „jū[email protected],
tema: 'Labas! Sveiki',
tekstas: `Sveiki ${name}, sveiki atvykę į MUO`
};

laukti sendgridMail.sendMail (pranešimas); // Siųsti laišką

// eilėje pažymėkite užduotį kaip atliktą
laukti emailJob.moveToCompleted('padaryta', tiesa);
konsolė.log(„El. laiškas sėkmingai išsiųstas...“);
} sugauti (klaida) {
// perkelti užduotį į nepavykusias užduotis
laukti emailJob.moveToFailed({ žinutę: 'užduoties apdorojimas nepavyko..' });
konsolė.error (klaida); // užregistruokite klaidą
}
}

eksportuotinumatytas Siųsti laišką;

Dabar, kai turite apibrėžtas ir paruoštas naudoti gamintojo ir vartotojo funkcijas, dabar galite paskambinti gamintojo funkcijai bet kurioje programos vietoje, kad įtrauktumėte el. laišką į apdorojimo eilę.

Valdiklio pavyzdys atrodytų taip:

// userController.js
konst EmailQueue = reikalauti(„../handlers/queueHandler.js“)

konst registracija = async (req, res) => {
konst { vardas, el. pašto adresas, slaptažodis } = req.body;

// --
// užklausa įtraukti naują vartotoją į duomenų bazę...
// --

// įtraukti į el. pašto eilę
konst emailData = {vardas, el.paštas};
laukti EmailQueue.addEmailToQueue (emailData);

res.status(200.json({
žinutė: "Sėkmingai prisiregistravote, patikrinkite savo el.
})
}

Tavo queueHandler.js dabar failas turėtų būti toks:

// queueHandler.js
konst Eilė = reikalauti("jautis");
konst emailHandler = reikalauti(„../handlers/emailHandler.js“);

konst REDIS_URL = „redis://127.0.0.1:6379“;

konst queueOpts = {
ribotuvas: {
maks.: 100,
trukmė: 10000
},

priešdėlis: 'EL. PAŠTAS - UŽDUOTIS',

defaultJobOptions: {
bandymai: 3,
RemoveOnComplete: tiesa
}
};

klasėEmailQueue{
konstruktorius() {
tai.eilė = naujas Eilė(„El. pašto eilė“, REDIS_URL, queueOpts);

// vartotojas
tai.queue.process('email_notification', async (el. paštasDarbas, atliktas) => {
konsolė.log('apdorojama el. pašto pranešimų užduotis');
laukti emailHandler.sendEmail (emailJob);
padaryta();
})
}

// gamintojas
async addEmailToQueue (emailData) {
// pridėti užduotį pavadinimu „email_notification“ į eilę
lauktitai.queue.add('email_notification', emailData);
konsolė.log('el. laiškas įtrauktas į eilę...');
}
};

eksportuotinumatytas EmailQueue;

Įdiegę tai Node.js REST API, pastebėsite sumažėjusį registracijos galinio taško atsako laiką ir greitesnį el. pašto pristatymo laiką, palyginti su alternatyva.

Užduočių eilės taip pat leido savarankiškai tvarkyti registracijos ir el. pašto klaidas.

Programų optimizavimas naudojant užduočių eiles

Pranešimų ir užduočių eilės yra puikus būdas pagerinti bendrą programų našumą. Jie taip pat yra labai pigūs ir galite juos naudoti tiek programos dalių, kiek jums reikia.

Nors šioje mokymo programoje el. laiškai buvo naudojami kaip pavyzdys, kaip tvarkyti atminties reikalaujančias užduotis su eilėmis, yra daug kitų atvejų, kai galite taikyti tas pačias sąvokas. Tai apima sunkias skaitymo / rašymo operacijas, aukštos kokybės vaizdų ar dokumentų pateikimą ir masinių pranešimų siuntimą.