Jako webový vývojář je důležité, aby vaše aplikace fungovaly co nejrychleji. Měli byste vytvářet webové aplikace, které reagují na požadavky v nejrychlejším možném čase.
Jednou z mnoha technologií, které vám mohou pomoci, je řazení úkolů.
Co je tedy řazení úloh do fronty a jak jej můžete použít k optimalizaci aplikace Node.js?
Co je řazení úkolů?
Fronta zpráv je prostředek asynchronní komunikace mezi dvěma aplikacemi nebo službami, obvykle označovaný jako výrobce a spotřebitel. Je to dobře známý koncept používaný v architekturách bez serverů a mikroslužeb.
Koncept úkol nebo práceve frontě využívá řazení zpráv do fronty ke zlepšení výkonu aplikací. Abstrahuje složitost správy zpráv a umožňuje definovat funkce pro správu úloh nebo úkolů asynchronně pomocí fronty, čímž se snižuje rychlost využití paměti v některých částech aplikace.
Nejběžnějším příkladem softwaru pro frontu zpráv je RabbitMQ. Nástroje fronty úkolů zahrnují Celery a Bull. RabbitMQ můžete také nakonfigurovat tak, aby fungoval jako fronta úloh. Čtěte dále a dozvíte se o řazení úloh do fronty v Node.js pomocí Bull.
Co je BullMQ?
BullMQ (Bull.js) je knihovna Node.js používaná k implementaci front v aplikacích Node. Bull je systém založený na Redis (možná vám je známější Redis jako nástroj pro rychlé ukládání dat) a je to rychlá a spolehlivá možnost, kterou je třeba zvážit pro řazení úloh v Node.js.
Bull můžete použít pro mnoho úloh, jako je implementace zpožděných úloh, naplánovaných úloh, opakovatelných úloh, prioritních front a mnoha dalších.
Jak tedy můžete použít Bull a Redis ke spouštění úloh Node.js asynchronně?
Jak nakonfigurovat Bull a Redis pro řazení úloh v Node.js
Chcete-li začít s řazením úloh v Node.js s Bull, musíte mít na svém počítači nainstalované Node.js a Redis. Můžete sledovat Průvodce laboratoří Redis pro instalaci Redis pokud ho nemáte nainstalovaný.
Prvním krokem k implementaci Bull je přidání do závislostí vašeho projektu spuštěním npm install bull nebo příze přidat býk v terminálu ve složce vašeho projektu. Existuje několik způsobů, jak inicializovat frontu v Bull, jak je uvedeno níže:
konst Fronta = vyžadovat('býk');
// různé způsoby inicializace fronty
// - pomocí redis URL řetězce
konst emailQueue = Nový Fronta('E-mailová fronta', 'redis://127.0.0.1:6379');// - s připojením redis a objektem voleb fronty
konst videoQueue = Nový Fronta('Video fronta', 'redis://127.0.0.1:6379', queueOptions);// - bez připojení redis, ale s queueOption
konst docQueue = Nový Fronta('Fronta dokumentů', queueOptions);
// - bez připojení redis nebo možností fronty
konst QueueClient = Nový Fronta('Moje fronta');
Tyto všechny používají minimální konfiguraci pro Bull v Node.js. Objekt options podporuje mnoho vlastností a můžete se o nich dozvědět v sekce možností fronty v dokumentaci Bull.
Implementace e-mailové fronty úloh pomocí BullMQ
Chcete-li implementovat frontu pro odesílání e-mailů, můžete definovat funkci producenta, která přidává e-maily do fronty e-mailů, a spotřebitelskou funkci pro zpracování odesílání e-mailů.
Nejprve můžete inicializovat frontu ve třídě pomocí adresy URL Redis a některých možností fronty, jak je vidět níže.
// queueHandler.js
konst Fronta = vyžadovat('býk');// zde použijte skutečný modul obsluhy e-mailů - toto je pouze příklad
konst emailHandler = vyžadovat('./emailHandler.js');// definuje konstanty, Redis URL a možnosti fronty
konst REDIS_URL = 'redis://127.0.0.1:6379';konst queueOpts = {
// možnosti omezovače rychlosti, aby nedošlo k přetížení fronty
omezovač: {
// maximální počet úkolů, které může fronta přijmout
max: 100,// čas čekání v milisekundách před přijetím nových úloh poté
// dosažení limitu
doba trvání: 10000
},
předpona: 'EMAIL-TASK', // předpona, která se přidá ke všem klíčům fronty
defaultJobOptions: { // výchozí možnosti pro úlohy ve frontě
pokusy: 3, // výchozí počet opakování úlohy// k odstranění úkolu z fronty po dokončení
removeOnComplete: skutečný
}
};třídaEmailQueue{
konstruktér() {
tento.fronta = Nový Fronta('E-mailová fronta', REDIS_URL, queueOpts);
}
};
vývoznívýchozí EmailQueue; // export třídy
Nyní, když jste inicializovali frontu, můžete definovat funkci producenta (pomocí Bull's přidat() funkce) jako metoda EmailQueue třídy pro přidání e-mailů do fronty úkolů. Následující blok kódu to ukazuje:
// queueHandler.js
třídaEmailQueue{
konstruktér () {
// ...
}// funkce producenta pro přidání e-mailů do fronty
asynchronní addEmailToQueue (emailData) {
// přidat úkol s názvem 'email_notification' do fronty
čekattento.queue.add('email upozornění', e-mailová data);
řídicí panel.log('e-mail byl přidán do fronty...');
}
};
vývoznívýchozí EmailQueue; // export třídy
Funkce producenta je připravena a nyní můžete definovat spotřebitelskou funkci (pomocí Bull's proces() funkce) ke zpracování všech e-mailových úkolů ve frontě – tzn. zavolejte funkci a odešlete e-mail. Tuto spotřebitelskou funkci byste měli definovat v konstruktoru třídy.
// queueHandler.js
třídaEmailQueue{
konstruktér () {
// ...// spotřebitelská funkce, která přebírá přiřazený název úlohy a
// funkce zpětného volání
tento.queue.process('email upozornění', asynchronní (e-mailJob, hotovo) => {
řídicí panel.log('processing email notification task');
čekat emailHandler.sendEmail (emailJob); // odeslat email
Hotovo(); // dokončit úkol
})
}
// ...
};
vývoznívýchozí EmailQueue; // export třídy
Úloha může mít také možnosti, jak definovat její chování ve frontě nebo jak s ní spotřebitelská funkce nakládá. Více se o tom můžete dozvědět v část o pracovních možnostech v dokumentaci Bull.
The emailJob argument je objekt, který obsahuje vlastnosti úlohy, kterou má fronta zpracovat. Obsahuje také hlavní data potřebná k vytvoření e-mailu. Pro snadné pochopení, poslat e-mailem() funkce by byla podobná tomuto příkladu:
// emailHandler.js
konst sendgridMail = vyžadovat('@sendgrid/mail');konst apiKey = process.env. SENDGRID_API_KEY
sendgridMail.setApiKey (apiKey); // nastavení bezpečnostních pověření e-mailového transportéru
konst poslatEmail = asynchronní (e-mailJob) => {
Snaž se {
// extrahujte data e-mailu z úlohy
konst { jméno, email } = emailJob.data;konst zpráva = {
z: '[email protected]',
na: '[email protected]',
předmět: 'Ahoj! Vítejte',
text: „Dobrý den ${name}, vítejte na MUO`
};čekat sendgridMail.sendMail (zpráva); // poslat e-mailem
// označit úkol jako dokončený ve frontě
čekat emailJob.moveToCompleted('Hotovo', skutečný);
řídicí panel.log('Email úspěšně odeslán...');
} chytit (chyba) {
// přesunout úlohu do neúspěšných úloh
čekat emailJob.moveToFailed({ zpráva: 'zpracování úlohy se nezdařilo..' });
řídicí panel.chyba (chyba); // zapište chybu
}
}
vývoznívýchozí poslat e-mailem;
Nyní, když máte jak produkční, tak spotřebitelské funkce definované a připravené k použití, můžete nyní zavolat svou produkční funkci kdekoli ve vaší aplikaci a přidat e-mail do fronty ke zpracování.
Příklad ovladače by vypadal takto:
// userController.js
konst EmailQueue = vyžadovat('../handlers/queueHandler.js')konst přihlásit se = asynchronní (req, res) => {
konst { jméno, email, heslo } = req.body;// --
// dotaz na přidání nového uživatele do databáze...
// --// přidat do fronty e-mailů
konst emailData = { jméno, email };
čekat EmailQueue.addEmailToQueue (emailData);
res.status(200.json({
zpráva: "Registrace byla úspěšná, prosím zkontrolujte svůj e-mail"
})
}
Vaše queueHandler.js soubor by měl být nyní následující:
// queueHandler.js
konst Fronta = vyžadovat('býk');
konst emailHandler = vyžadovat('../handlers/emailHandler.js');konst REDIS_URL = 'redis://127.0.0.1:6379';
konst queueOpts = {
omezovač: {
max: 100,
doba trvání: 10000
},předpona: 'EMAIL-TASK',
defaultJobOptions: {
pokusy: 3,
removeOnComplete: skutečný
}
};třídaEmailQueue{
konstruktér() {
tento.fronta = Nový Fronta('E-mailová fronta', REDIS_URL, queueOpts);// spotřebitel
tento.queue.process('email upozornění', asynchronní (e-mailJob, hotovo) => {
řídicí panel.log('processing email notification task');
čekat emailHandler.sendEmail (emailJob);
Hotovo();
})
}// výrobce
asynchronní addEmailToQueue (emailData) {
// přidat úkol s názvem 'email_notification' do fronty
čekattento.queue.add('email upozornění', e-mailová data);
řídicí panel.log('e-mail byl přidán do fronty...');
}
};
vývoznívýchozí EmailQueue;
Když to implementujete do Node.js REST API, zaznamenáte zkrácení doby odezvy koncového bodu registrace a rychlejší doby doručení e-mailu ve srovnání s alternativou.
Fronty úkolů vám také umožnily samostatně zpracovávat chyby při registraci a e-mailu.
Optimalizace aplikací pomocí front úloh
Fronty zpráv a úloh jsou skvělým způsobem, jak zlepšit obecný výkon aplikací. Jsou také velmi levné a můžete je použít v tolika částech aplikace, kolik potřebujete.
Ačkoli tento kurz používal e-maily jako příklad scénáře pro zpracování úloh náročných na paměť s frontami, existuje mnoho dalších případů, kdy můžete použít stejné koncepty. Patří mezi ně náročné operace čtení/zápisu, vykreslování vysoce kvalitních obrázků nebo dokumentů a rozesílání hromadných oznámení.