Као веб програмер, кључно је да ваше апликације раде што брже могу. Требало би да направите веб апликације које одговарају на захтеве у најбржем могућем времену.
Једна од многих технологија које вам могу помоћи је постављање задатака у ред чекања.
Дакле, шта је чекање задатака и како га можете користити за оптимизацију Ноде.јс апликације?
Шта је чекање задатака?
Ред порука је средство асинхроне комуникације између две апликације или услуге, које се обично назива продуцент и потрошача. То је добро познат концепт који се користи у архитектури без сервера и микросервисима.
Концепт задатак или посаостати у ред користи редове порука за побољшање перформанси апликације. Он апстрахује сложеност управљања порукама и омогућава вам да дефинишете функције за асинхроно управљање пословима или задацима користећи ред, чиме се смањује стопа употреба меморије у неким деловима апликације.
Најчешћи пример софтвера за ред порука је РаббитМК. Алати за ред задатака укључују Целери и Булл. Такође можете да конфигуришете РаббитМК да ради као ред задатака. Читајте даље да бисте сазнали о чекању задатака у Ноде.јс користећи Булл.
Шта је БуллМК?
БуллМК (Булл.јс) је библиотека Ноде.јс која се користи за имплементацију редова у Ноде апликацијама. Булл је систем заснован на Редис-у (можда сте боље упознати са Редис-ом као алатом за брзо складиштење података) и то је брза и поуздана опција коју треба размотрити за чекање задатака у Ноде.јс.
Булл можете користити за многе задатке као што су имплементација одложених послова, заказани послови, поновљиви послови, приоритетни редови и још много тога.
Дакле, како можете да користите Булл и Редис за асинхроно покретање Ноде.јс задатака?
Како конфигурисати Булл и Редис за чекање задатака у Ноде.јс
Да бисте започели са стављањем у ред задатака у Ноде.јс са Булл-ом, потребни су вам Ноде.јс и Редис инсталирани на вашој машини. Можете пратити Редис лабораторијски водич за инсталирање Редис-а ако га немате инсталиран.
Први корак у имплементацији Булл-а је да га додате у зависности вашег пројекта покретањем нпм инсталл булл или пређе додати бик у терминалу унутар фасцикле вашег пројекта. Постоји више начина за иницијализацију реда у Булл-у као што је приказано у наставку:
конст Куеуе = захтевају('бик');
// различити начини за иницијализацију реда
// - користећи редис УРЛ стринг
конст емаилКуеуе = Нова у реду('Рег за е-пошту', 'редис://127.0.0.1:6379');// - са редис везом и објектом опција реда чекања
конст видеоКуеуе = Нова у реду('Видео ред', 'редис://127.0.0.1:6379', куеуеОптионс);// - без редис везе али са куеуеОптион
конст доцКуеуе = Нова у реду(„Ред за документе“, куеуеОптионс);
// - без редис везе или опција реда
конст КуеуеЦлиент = Нова у реду('Мој ред');
Све ово користи минималну конфигурацију за Булл у Ноде.јс. Објекат опција подржава многа својства и о њима можете сазнати у одељак опција реда у Булл-овој документацији.
Имплементација реда задатака е-поште користећи БуллМК
Да бисте имплементирали ред за слање е-поште, можете дефинисати своју функцију произвођача која додаје е-пошту у ред е-поште и потрошачку функцију за руковање слањем е-поште.
Прво, можете иницијализовати свој ред у класи користећи Редис УРЛ и неке опције реда као што је приказано у наставку.
// куеуеХандлер.јс
конст Куеуе = захтевају('бик');// овде користимо прави модул за обраду е-поште - ово је само пример
конст емаилХандлер = захтевају('./емаилХандлер.јс');// дефинише константе, Редис УРЛ и опције реда
конст РЕДИС_УРЛ = 'редис://127.0.0.1:6379';конст куеуеОптс = {
// опције за ограничавање брзине да би се избегло преоптерећење реда
лимитер: {
// максималан број задатака који ред може да преузме
мак: 100,// време чекања у милисекундама пре прихватања нових послова после
// достизање границе
трајање: 10000
},
префикс: 'ЕМАИЛ-ТАСК', // префикс који се додаје свим кључевима реда
дефаултЈобОптионс: { // подразумеване опције за задатке у реду
покушаји: 3, // подразумевани број пута за поновни покушај задатка// да уклонимо задатак из реда након завршетка
ремовеОнЦомплете: истина
}
};класаЕмаилКуеуе{
конструктор() {
ово.куеуе = Нова у реду('Рег за е-пошту', РЕДИС_УРЛ, куеуеОптс);
}
};
извозУобичајено ЕмаилКуеуе; // извоз класе
Сада када сте иницијализовали ред, можете дефинисати своју функцију произвођача (помоћу Булл-ове додати() функција) као метод за ЕмаилКуеуе класе за додавање е-поште у ред задатака. Следећи блок кода то демонстрира:
// куеуеХандлер.јс
класаЕмаилКуеуе{
конструктор () {
// ...
}// функција произвођача за додавање е-порука у ред
асинц аддЕмаилТоКуеуе (емаилДата) {
// додај задатак са именом 'емаил_нотифицатион' у ред чекања
чекатиово.куеуе.адд('и-мејл обавештење', емаилДата);
конзола.Пријава('е-пошта је додата у ред...');
}
};
извозУобичајено ЕмаилКуеуе; // извоз класе
Функција произвођача је спремна и сада можете дефинисати функцију потрошача (помоћу Булл'с процес() функција) за обраду свих задатака е-поште у реду—тј. позовите функцију да пошаљете е-пошту. Требало би да дефинишете ову потрошачку функцију у конструктору класе.
// куеуеХандлер.јс
класаЕмаилКуеуе{
конструктор () {
// ...// потрошачка функција која преузима додељено име задатка и
// функција повратног позива
ово.куеуе.процесс('и-мејл обавештење', асинц (е-маилЈоб, готово) => {
конзола.Пријава('задатак обраде обавештења путем е-поште');
чекати емаилХандлер.сендЕмаил (емаилЈоб); // послати е-маил
Готово(); // заврши задатак
})
}
// ...
};
извозУобичајено ЕмаилКуеуе; // извоз класе
Посао такође може имати опције да дефинише своје понашање у реду или како потрошачка функција њиме рукује. Више о овоме можете сазнати у одељак о опцијама посла у Булл-овој документацији.
Тхе емаилЈоб аргумент је објекат који садржи својства задатка који ред треба да обради. Такође укључује главне податке потребне за израду е-поште. За лакше разумевање, шаљи имејл() функција би била слична овом примеру:
// емаилХандлер.јс
конст сендгридМаил = захтевају('@сендгрид/маил');конст апиКеи = процесс.енв. СЕНДГРИД_АПИ_КЕИ
сендгридМаил.сетАпиКеи (апиКеи); // поставља безбедносне акредитиве транспортера е-поште
конст сендЕмаил = асинц (емаилЈоб) => {
покушати {
// извлачи податке е-поште из посла
конст { име, емаил } = емаилЈоб.дата;конст порука = {
из: 'ме@екампле.цом',
до: 'ви@екампле.цом',
предмет: 'Здраво! Добродошли',
текст: `Здраво ${наме}, добродошли у МУО`
};чекати сендгридМаил.сендМаил (порука); // шаљи имејл
// означити задатак као завршен у реду
чекати емаилЈоб.мовеТоЦомплетед('Готово', истина);
конзола.Пријава(„Е-пошта је успешно послата...“);
} улов (грешка) {
// преместити задатак на неуспеле послове
чекати емаилЈоб.мовеТоФаилед({ порука: 'обрада задатка није успела..' });
конзола.еррор (грешка); // евидентирати грешку
}
}
извозУобичајено шаљи имејл;
Сада када имате дефинисане и спремне за употребу и функције произвођача и потрошача, сада можете позвати своју функцију произвођача било где у апликацији да додате е-пошту у ред за обраду.
Пример контролера би изгледао овако:
// усерЦонтроллер.јс
конст ЕмаилКуеуе = захтевају('../хандлерс/куеуеХандлер.јс')конст сигнУп = асинц (рек, рес) => {
конст { име, емаил, лозинка } = рек.боди;// --
// упит за додавање новог корисника у базу података...
// --// додај у ред е-поште
конст емаилДата = { име, емаил };
чекати ЕмаилКуеуе.аддЕмаилТоКуеуе (емаилДата);
рес.статус(200).јсон({
порука: „Регистрација је успешна, проверите своју е-пошту“
})
}
Твоје куеуеХандлер.јс датотека сада треба да буде следећа:
// куеуеХандлер.јс
конст Куеуе = захтевају('бик');
конст емаилХандлер = захтевају('../хандлерс/емаилХандлер.јс');конст РЕДИС_УРЛ = 'редис://127.0.0.1:6379';
конст куеуеОптс = {
лимитер: {
мак: 100,
трајање: 10000
},префикс: 'ЕМАИЛ-ТАСК',
дефаултЈобОптионс: {
покушаји: 3,
ремовеОнЦомплете: истина
}
};класаЕмаилКуеуе{
конструктор() {
ово.куеуе = Нова у реду('Рег за е-пошту', РЕДИС_УРЛ, куеуеОптс);// потрошач
ово.куеуе.процесс('и-мејл обавештење', асинц (е-маилЈоб, готово) => {
конзола.Пријава('задатак обраде обавештења путем е-поште');
чекати емаилХандлер.сендЕмаил (емаилЈоб);
Готово();
})
}// продуцент
асинц аддЕмаилТоКуеуе (емаилДата) {
// додај задатак са именом 'емаил_нотифицатион' у ред чекања
чекатиово.куеуе.адд('и-мејл обавештење', емаилДата);
конзола.Пријава('е-пошта је додата у ред...');
}
};
извозУобичајено ЕмаилКуеуе;
Када ово имплементирате у Ноде.јс РЕСТ АПИ, приметићете смањење времена одговора крајње тачке регистрације и брже време испоруке е-поште у поређењу са алтернативом.
Редови задатака су вам такође омогућили да самостално рукујете грешкама приликом регистрације и е-поште.
Оптимизација апликација помоћу редова задатака
Редови порука и задатака су одличан начин за побољшање општих перформанси апликација. Такође су веома јефтини и можете их користити у онолико делова апликације колико вам је потребно.
Иако је овај водич користио е-пошту као пример сценарија за руковање задацима који троше меморију са редовима, постоји много других случајева у којима можете применити исте концепте. То укључује тешке операције читања/писања, приказивање висококвалитетних слика или докумената и слање групних обавештења.