Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

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.

instagram viewer

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í.