Czytelnicy tacy jak ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską. Czytaj więcej.

Jako programista stron internetowych bardzo ważne jest, aby Twoje aplikacje działały tak szybko, jak to możliwe. Powinieneś tworzyć aplikacje internetowe, które odpowiadają na żądania w jak najkrótszym czasie.

Jedną z wielu technologii, które mogą ci w tym pomóc, jest kolejkowanie zadań.

Czym więc jest kolejkowanie zadań i jak można go wykorzystać do optymalizacji aplikacji Node.js?

Co to jest kolejkowanie zadań?

Kolejkowanie wiadomości to sposób asynchronicznej komunikacji między dwiema aplikacjami lub usługami, zwykle określany jako producent I konsument. Jest to dobrze znana koncepcja stosowana w architekturach bezserwerowych i mikroserwisowych.

koncepcja zadanie Lub stanowiskow kolejce wykorzystuje kolejkowanie wiadomości w celu poprawy wydajności aplikacji. Abstrahuje złożoność zarządzania komunikatami i umożliwia definiowanie funkcji do asynchronicznego zarządzania zadaniami lub zadaniami przy użyciu kolejki, zmniejszając w ten sposób szybkość

instagram viewer
zużycie pamięci w niektórych częściach aplikacji.

Najczęstszym przykładem oprogramowania kolejki komunikatów jest RabbitMQ. Narzędzia kolejki zadań obejmują Seler i Bull. Możesz także skonfigurować RabbitMQ do pracy jako kolejka zadań. Czytaj dalej, aby dowiedzieć się o kolejkowaniu zadań w Node.js przy użyciu Bulla.

Co to jest BullMQ?

BullMQ (Bull.js) to biblioteka Node.js używana do implementacji kolejek w aplikacjach Node. Bull to system oparty na Redis (możesz być bardziej zaznajomiony z Redis jako narzędziem do szybkie przechowywanie danych) i jest to szybka i niezawodna opcja do rozważenia przy kolejkowaniu zadań w Node.js.

Możesz używać Bulla do wielu zadań, takich jak wdrażanie zadań opóźnionych, zaplanowanych, powtarzalnych, kolejek priorytetowych i wielu innych.

Jak więc wykorzystać Bull i Redis do asynchronicznego uruchamiania zadań Node.js?

Jak skonfigurować Bull i Redis do kolejkowania zadań w Node.js

Aby zacząć korzystać z kolejkowania zadań w Node.js z Bullem, musisz mieć zainstalowane Node.js i Redis na swoim komputerze. Możesz śledzić Przewodnik po laboratoriach Redis dotyczący instalacji Redis jeśli nie masz go zainstalowanego.

Pierwszym krokiem do wdrożenia Bulla jest dodanie go do zależności projektu przez uruchomienie npm zainstaluj byka Lub przędza dodaj byka w terminalu w folderze twojego projektu. Istnieje wiele sposobów inicjowania kolejki w Bull, jak pokazano poniżej:

konst Kolejka = wymagać('byk');

// różne sposoby inicjowania kolejki
// - przy użyciu łańcucha adresu URL redis
konst kolejka e-maili = nowy Kolejka(„Kolejka poczty e-mail”, „redis://127.0.0.1:6379”);

// - z połączeniem redis i obiektem opcji kolejki
konst kolejka wideo = nowy Kolejka(„Kolejka wideo”, „redis://127.0.0.1:6379”, opcje kolejki);

// - bez połączenia redis, ale z opcją kolejki
konst kolejka dokumentów = nowy Kolejka(„Kolejka dokumentów”, opcje kolejki);

// - bez połączenia redis lub opcji kolejki
konst Klient kolejki = nowy Kolejka(„Moja kolejka”);

Wszystkie one używają minimalnej konfiguracji dla Bull w Node.js. Obiekt options obsługuje wiele właściwości i możesz się o nich dowiedzieć w sekcji opcji kolejki w dokumentacji Bulla.

Implementacja kolejki zadań e-mail za pomocą BullMQ

Aby zaimplementować kolejkę do wysyłania wiadomości e-mail, możesz zdefiniować funkcję producenta, która dodaje wiadomości e-mail do kolejki wiadomości e-mail, oraz funkcję konsumenta do obsługi wysyłania wiadomości e-mail.

Po pierwsze, możesz zainicjować kolejkę w klasie, używając adresu URL Redis i niektórych opcji kolejki, jak pokazano poniżej.

// kolejkaHandler.js
konst Kolejka = wymagać('byk');

// użyj tutaj prawdziwego modułu obsługi poczty e-mail - to tylko przykład
konst obsługa poczty e-mail = wymagać(„./emailHandler.js”);

// zdefiniuj stałe, adres URL Redis i opcje kolejki
konst REDIS_URL = „redis://127.0.0.1:6379”;

konst kolejkaOpts = {
// opcje ogranicznika szybkości, aby uniknąć przeciążenia kolejki
ogranicznik: {
// maksymalna liczba zadań, które może przyjąć kolejka
maks: 100,

// czas oczekiwania w milisekundach przed zaakceptowaniem nowych zadań po
// osiągnięcie limitu
czas trwania: 10000
},
prefiks: „ZADANIE E-MAIL”, // przedrostek, który ma zostać dodany do wszystkich kluczy kolejki
domyślne opcje pracy: { // domyślne opcje dla zadań w kolejce
próbowanie: 3, // domyślna liczba ponownych prób wykonania zadania

// aby usunąć zadanie z kolejki po zakończeniu
usuń po zakończeniu: PRAWDA
}
};

klasaKolejka e-maili{
konstruktor() {
Ten.kolejka = nowy Kolejka(„Kolejka poczty e-mail”, REDIS_URL, opcje kolejki);
}
};

eksportdomyślny Kolejka e-maili; // wyeksportuj klasę

Teraz, gdy zainicjowałeś kolejkę, możesz zdefiniować swoją funkcję producenta (używając Bull's dodać() funkcja) jako metoda Kolejka e-maili class, aby dodać wiadomości e-mail do kolejki zadań. Pokazuje to następujący blok kodu:

// kolejkaHandler.js

klasaKolejka e-maili{
konstruktor () {
// ...
}

// funkcja producenta dodająca e-maile do kolejki
asynchroniczny dodaj e-mail do kolejki (dane e-maila) {
// dodaj zadanie o nazwie „email_notification” do kolejki
czekać naTen.kolejka.add('Powiadomienie e-mail', e-mailDane);
konsola.dziennik('e-mail został dodany do kolejki...');
}
};

eksportdomyślny Kolejka e-maili; // wyeksportuj klasę

Funkcja producenta jest gotowa i możesz teraz zdefiniować funkcję konsumenta (używając Bull's proces() funkcja) do przetwarzania wszystkich zadań e-mail w kolejce — tj. wywołaj funkcję, aby wysłać wiadomość e-mail. Powinieneś zdefiniować tę funkcję konsumenta w konstruktorze klasy.

// kolejkaHandler.js
klasaKolejka e-maili{
konstruktor () {
// ...

// funkcja konsumenta, która przyjmuje przypisaną nazwę zadania i
// funkcja wywołania zwrotnego
Ten.kolejka.proces('Powiadomienie e-mail', asynchroniczny (emailJob, gotowe) => {
konsola.dziennik(„przetwarzanie zadania powiadomienia e-mail”);
czekać na emailHandler.sendEmail (emailJob); // wyślij e-mail
zrobione(); // wykonać zadanie
})
}
// ...
};

eksportdomyślny Kolejka e-maili; // wyeksportuj klasę

Zadanie może mieć również opcje definiujące jego zachowanie w kolejce lub sposób, w jaki obsługuje je funkcja konsumenta. Więcej na ten temat można znaleźć w sekcji opcji pracy w dokumentacji firmy Bull.

The e-mailZadanie argument jest obiektem, który zawiera właściwości zadania do przetworzenia przez kolejkę. Zawiera również podstawowe dane potrzebne do skonstruowania wiadomości e-mail. Dla łatwego zrozumienia, wysłać email() funkcja byłaby podobna do tego przykładu:

// emailHandler.js
konst sendgridMail = wymagać('@sendgrid/poczta');

konst apiKey = proces.env. SENDGRID_API_KEY

sendgridMail.setApiKey (apiKey); // ustaw poświadczenia bezpieczeństwa transportera poczty e-mail

konst wyślij e-mail = asynchroniczny (emailJob) => {
próbować {
// wyodrębnij dane e-mail z zadania
konst { imię i nazwisko, e-mail } = e-mailJob.data;

konst wiadomość = {
z: [email protected],
Do: [email protected],
temat: 'Cześć! Powitanie',
tekst: `Cześć ${nazwa}, witamy w MUO`
};

czekać na sendgridMail.sendMail (wiadomość); // wysłać email

// zaznacz zadanie jako ukończone w kolejce
czekać na emailJob.moveToCompleted('zrobione', PRAWDA);
konsola.dziennik(„E-mail został pomyślnie wysłany...”);
} złapać (błąd) {
// przenieś zadanie do nieudanych zadań
czekać na emailJob.moveToFailed({ wiadomość: „przetwarzanie zadania nie powiodło się...” });
konsola.błąd (błąd); // zarejestruj błąd
}
}

eksportdomyślny wysłać email;

Teraz, gdy masz już zdefiniowane i gotowe do użycia funkcje producenta i konsumenta, możesz teraz wywołać funkcję producenta w dowolnym miejscu aplikacji, aby dodać wiadomość e-mail do kolejki do przetworzenia.

Przykładowy kontroler wyglądałby tak:

// userController.js
konst Kolejka e-maili = wymagać(„../obsługa/obsługa kolejki.js”)

konst zarejestruj się = asynchroniczny (wymaganie, res) => {
konst { imię i nazwisko, e-mail, hasło } = req.body;

// --
// zapytanie o dodanie nowego użytkownika do bazy danych...
// --

// dodaj do kolejki e-mail
konst e-mailData = { imię i nazwisko, e-mail };
czekać na EmailQueue.addEmailToQueue (emailData);

res.status(200.json({
wiadomość: "Zarejestruj się pomyślnie, sprawdź swoją skrzynkę e-mail"
})
}

Twój kolejkaHandler.js plik powinien teraz wyglądać następująco:

// kolejkaHandler.js
konst Kolejka = wymagać('byk');
konst obsługa poczty e-mail = wymagać(„../handlers/emailHandler.js”);

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

konst kolejkaOpts = {
ogranicznik: {
maks: 100,
czas trwania: 10000
},

prefiks: „ZADANIE E-MAIL”,

domyślne opcje pracy: {
próbowanie: 3,
usuń po zakończeniu: PRAWDA
}
};

klasaKolejka e-maili{
konstruktor() {
Ten.kolejka = nowy Kolejka(„Kolejka poczty e-mail”, REDIS_URL, opcje kolejki);

// konsument
Ten.kolejka.proces('Powiadomienie e-mail', asynchroniczny (emailJob, gotowe) => {
konsola.dziennik(„przetwarzanie zadania powiadomienia e-mail”);
czekać na emailHandler.sendEmail (emailJob);
zrobione();
})
}

// producent
asynchroniczny dodaj e-mail do kolejki (dane e-maila) {
// dodaj zadanie o nazwie „email_notification” do kolejki
czekać naTen.kolejka.add('Powiadomienie e-mail', e-mailDane);
konsola.dziennik('e-mail został dodany do kolejki...');
}
};

eksportdomyślny Kolejka e-maili;

Gdy zaimplementujesz to w interfejsie API REST Node.js, zauważysz skrócenie czasu odpowiedzi punktu końcowego rejestracji i szybsze dostarczanie wiadomości e-mail w porównaniu z rozwiązaniem alternatywnym.

Kolejki zadań umożliwiły również niezależną obsługę błędów rejestracji i poczty e-mail.

Optymalizacja aplikacji przy użyciu kolejek zadań

Kolejki komunikatów i zadań to doskonały sposób na poprawę ogólnej wydajności aplikacji. Są również bardzo tanie i można ich używać w dowolnej liczbie części aplikacji.

Chociaż w tym samouczku wiadomości e-mail były przykładowym scenariuszem obsługi zadań zużywających pamięć z kolejkami, istnieje wiele innych przypadków, w których można zastosować te same koncepcje. Obejmują one ciężkie operacje odczytu/zapisu, renderowanie wysokiej jakości obrazów lub dokumentów oraz wysyłanie masowych powiadomień.