Teiesugused lugejad aitavad MUO-d toetada. Kui teete ostu meie saidil olevate linkide abil, võime teenida sidusettevõtte komisjonitasu. Loe rohkem.

Veebiarendajana on ülioluline, et teie rakendused töötaksid nii kiiresti kui võimalik. Peaksite looma veebirakendusi, mis vastavad päringutele võimalikult kiiresti.

Üks paljudest tehnoloogiatest, mis teid aidata võib, on ülesannete järjekord.

Niisiis, mis on ülesannete järjekord ja kuidas saate seda kasutada Node.js-i rakenduse optimeerimiseks?

Mis on ülesannete järjekord?

Sõnumijärjekord on asünkroonse suhtluse vahend kahe rakenduse või teenuse vahel, mida tavaliselt nimetatakse tootja ja tarbija. See on tuntud kontseptsioon, mida kasutatakse serverita ja mikroteenuste arhitektuurides.

Mõiste ülesanne või tööjärjekorras seismine kasutab sõnumite järjekorda, et parandada rakenduse jõudlust. See võtab kokku sõnumite haldamise keerukuse ja võimaldab määratleda funktsioone tööde või ülesannete asünkroonseks haldamiseks järjekorda kasutades, vähendades sellega mälukasutus mõnes rakenduse osas.

instagram viewer

Kõige tavalisem sõnumijärjekorra tarkvara näide on RabbitMQ. Ülesandejärjekorra tööriistade hulka kuuluvad seller ja pull. Samuti saate konfigureerida RabbitMQ toimima tegumijärjekorrana. Lugege edasi, et saada teavet Node.js-i ülesannete järjekorra kohta Bulli abil.

Mis on BullMQ?

BullMQ (Bull.js) on Node.js-i teek, mida kasutatakse Node'i rakendustes järjekordade juurutamiseks. Bull on Redisel põhinev süsteem (võite olla Redisega rohkem tuttav kui tööriist kiire andmete salvestamine) ning see on kiire ja usaldusväärne võimalus, mida kaaluda Node.js-is ülesannete järjekorda seadmisel.

Bulli saate kasutada paljude ülesannete jaoks, näiteks viivitatud tööde, ajastatud tööde, korratavate tööde, prioriteetsete järjekordade ja paljude muude ülesannete rakendamiseks.

Niisiis, kuidas saate kasutada Bulli ja Redist Node.js-i ülesannete asünkroonseks käitamiseks?

Bulli ja Redise konfigureerimine ülesannete järjekorra jaoks rakenduses Node.js

Funktsioonis Node.js koos Bulliga ülesannete järjekorda seadmise alustamiseks peavad teie arvutisse installitud Node.js ja Redis. Võite järgida Redise labori juhend Redise installimiseks kui teil pole seda installitud.

Bulli rakendamise esimene samm on selle lisamine oma projekti sõltuvustesse käivitamise teel npm install bull või lõng lisa pull terminalis teie projekti kaustas. Järjekorra lähtestamiseks Bullis on mitu võimalust, nagu allpool näidatud.

konst Järjekord = nõuda("pull");

// erinevad viisid järjekorra lähtestamiseks
// - kasutades redis URL-i stringi
konst emailQueue = uus Queue("E-posti järjekord", "redis://127.0.0.1:6379");

// - redis-ühenduse ja järjekorravalikute objektiga
konst videoQueue = uus Queue("Video järjekord", "redis://127.0.0.1:6379", queueOptions);

// - ilma redis-ühenduseta, kuid queueOptioniga
konst docQueue = uus Queue("Dokumendi järjekord", queueOptions);

// - ilma redis-ühenduseta või järjekorravalikuteta
konst QueueClient = uus Queue("Minu järjekord");

Need kõik kasutavad Node.js-s Bulli jaoks minimaalset konfiguratsiooni. Suvandite objekt toetab paljusid atribuute ja saate nende kohta teavet lugeda Bulli dokumentatsiooni järjekorra valikute jaotises.

Meiliülesannete järjekorra rakendamine BullMQ abil

Meilide saatmise järjekorra rakendamiseks saate määratleda oma tootjafunktsiooni, mis lisab meilid meilijärjekorda, ja tarbijafunktsiooni, mis haldab meilide saatmist.

Esiteks saate oma järjekorra initsialiseerida klassis, kasutades Redise URL-i ja mõnda järjekorravalikut, nagu allpool näha.

// queueHandler.js
konst Järjekord = nõuda("pull");

// kasuta siin tõelist meilitöötleja moodulit – see on vaid näide
konst emailHandler = nõuda('./emailHandler.js');

// konstandid, Redis URL-i ja järjekorra valikud
konst REDIS_URL = "redis://127.0.0.1:6379";

konst queueOpts = {
// määra piiraja valikud, et vältida järjekorra ülekoormamist
piiraja: {
// maksimaalne ülesannete arv, mida järjekord võib võtta
max: 100,

// ootamisaeg millisekundites enne uute tööde vastuvõtmist pärast
// saavutab piiri
kestus: 10000
},
eesliide: 'EMAIL-ÜLESANNE', // eesliide, mis lisatakse kõigile järjekorra võtmetele
defaultJobOptions: { // järjekorras olevate ülesannete vaikesuvandid
katsed: 3, // vaikimisi mitu korda ülesande uuesti proovimiseks

// ülesande eemaldamiseks järjekorrast pärast lõpetamist
RemoveOnComplete: tõsi
}
};

klassEmailQueue{
konstruktor() {
see.järjekord = uus Queue("E-posti järjekord", REDIS_URL, queueOpts);
}
};

eksportidavaikimisi EmailQueue; // klassi eksportimine

Nüüd, kui olete järjekorra initsialiseerinud, saate määratleda oma tootjafunktsiooni (kasutades Bulli lisama() funktsioon) kui meetodit EmailQueue klassis meilide lisamiseks ülesannete järjekorda. Järgmine koodiplokk näitab seda:

// queueHandler.js

klassEmailQueue{
konstruktor () {
// ...
}

// tootjafunktsioon e-kirjade järjekorda lisamiseks
asünkr addEmailToQueue (emailData) {
// lisage järjekorda ülesanne nimega 'email_notification'
ootamasee.queue.add('email_notification', emailData);
konsool.log('e-post on järjekorda lisatud...');
}
};

eksportidavaikimisi EmailQueue; // klassi eksportimine

Tootjafunktsioon on valmis ja nüüd saate määratleda tarbijafunktsiooni (kasutades Bull's protsess () funktsioon), et töödelda kõiki järjekorras olevaid meiliülesandeid – st. helistage funktsioonile e-kirja saatmiseks. Selle tarbijafunktsiooni peaksite määratlema klassi konstruktoris.

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

// tarbijafunktsioon, mis võtab ülesandele määratud nimetuse ja
// tagasihelistamise funktsioon
see.queue.process('email_notification', asünkr (emailTöö, tehtud) => {
konsool.log('meiliteavituse töötlemine');
ootama emailHandler.sendEmail (emailJob); // saada kiri
tehtud (); // täitke ülesanne
})
}
// ...
};

eksportidavaikimisi EmailQueue; // klassi eksportimine

Tööl võib olla ka valikuid, kuidas määratleda oma käitumist järjekorras või kuidas tarbijafunktsioon seda käsitleb. Selle kohta saate lisateavet jaotisest Bulli dokumentatsiooni töövalikute jaotises.

The meilTöö argument on objekt, mis sisaldab järjekorra töödeldava ülesande atribuute. See sisaldab ka e-kirja koostamiseks vajalikke põhiandmeid. Arusaadavuse hõlbustamiseks saada email() funktsioon oleks sarnane sellele näitele:

// emailHandler.js
konst sendgridMail = nõuda('@sendgrid/mail');

konst apiKey = process.env. SENDGRID_API_KEY

sendgridMail.setApiKey (apiKey); // määrake meilitranspordi turbemandaadid

konst sendEmail = asünkr (emailJob) => {
proovi {
// eraldage tööst meiliandmed
konst { nimi, email } = emailJob.andmed;

konst sõnum = {
alates: "[email protected]",
kellele: '[email protected]',
teema: 'Tere! Tere tulemast',
tekst: `Tere ${name}, tere tulemast MUO`sse
};

ootama sendgridMail.sendMail (sõnum); // saada email

// märkige ülesanne järjekorras lõpetatuks
ootama emailJob.moveToCompleted('tehtud', tõsi);
konsool.log("E-kiri edukalt saadetud...");
} püüda (viga) {
// teisaldage ülesanne ebaõnnestunud töödele
ootama emailJob.moveToFailed({ sõnum: 'ülesande töötlemine ebaõnnestus..' });
konsool.error (viga); // logige viga
}
}

eksportidavaikimisi saada email;

Nüüd, kui nii tootja- kui ka tarbijafunktsioonid on määratletud ja kasutamiseks valmis, saate nüüd helistada oma tootjafunktsioonile kõikjal oma rakenduses, et lisada e-kiri töötlemise järjekorda.

Kontrolleri näidis näeb välja selline:

// userController.js
konst EmailQueue = nõuda("../handlers/queueHandler.js")

konst registreerumine = asünkr (req, res) => {
konst { nimi, email, parool } = req.body;

// --
// päring uue kasutaja lisamiseks andmebaasi...
// --

// lisa e-posti järjekorda
konst emailData = { nimi, email };
ootama EmailQueue.addEmailToQueue (emailData);

res.status(200).json({
sõnum: "Registreerumine õnnestus, kontrollige oma e-posti"
})
}

Sinu queueHandler.js fail peaks nüüd olema järgmine:

// queueHandler.js
konst Järjekord = nõuda("pull");
konst emailHandler = nõuda("../handlers/emailHandler.js");

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

konst queueOpts = {
piiraja: {
max: 100,
kestus: 10000
},

eesliide: 'EMAIL-ÜLESANNE',

defaultJobOptions: {
katsed: 3,
RemoveOnComplete: tõsi
}
};

klassEmailQueue{
konstruktor() {
see.järjekord = uus Queue("E-posti järjekord", REDIS_URL, queueOpts);

// tarbija
see.queue.process('email_notification', asünkr (emailTöö, tehtud) => {
konsool.log('meiliteavituse töötlemine');
ootama emailHandler.sendEmail (emailJob);
tehtud ();
})
}

// tootja
asünkr addEmailToQueue (emailData) {
// lisage järjekorda ülesanne nimega 'email_notification'
ootamasee.queue.add('email_notification', emailData);
konsool.log('e-post on järjekorda lisatud...');
}
};

eksportidavaikimisi EmailQueue;

Kui rakendate selle Node.js REST API-s, märkate registreerimise lõpp-punkti reageerimisaja lühenemist ja e-posti kiiremaid kohaletoimetamisaegu võrreldes alternatiiviga.

Ülesandejärjekorrad võimaldasid teil ka registreerimis- ja e-posti vigu iseseisvalt käsitleda.

Rakenduste optimeerimine ülesannete järjekordade abil

Sõnumite ja ülesannete järjekorrad on suurepärane viis rakenduste üldise jõudluse parandamiseks. Need on ka väga odavad ja saate neid kasutada nii paljudes rakenduse osades kui vaja.

Kuigi selles õpetuses kasutati e-kirju stsenaariumina mälumahukate ja järjekorraga toimingute käsitlemiseks, on palju muid juhtumeid, kus saate samu kontseptsioone rakendada. Nende hulka kuuluvad rasked lugemis-/kirjutustoimingud, kvaliteetsete piltide või dokumentide renderdamine ja hulgiteatiste saatmine.