Читаоци попут вас помажу у подршци МУО. Када обавите куповину користећи везе на нашем сајту, можда ћемо зарадити провизију за партнере. Опширније.

Као веб програмер, кључно је да ваше апликације раде што брже могу. Требало би да направите веб апликације које одговарају на захтеве у најбржем могућем времену.

Једна од многих технологија које вам могу помоћи је постављање задатака у ред чекања.

Дакле, шта је чекање задатака и како га можете користити за оптимизацију Ноде.јс апликације?

Шта је чекање задатака?

Ред порука је средство асинхроне комуникације између две апликације или услуге, које се обично назива продуцент и потрошача. То је добро познат концепт који се користи у архитектури без сервера и микросервисима.

Концепт задатак или посаостати у ред користи редове порука за побољшање перформанси апликације. Он апстрахује сложеност управљања порукама и омогућава вам да дефинишете функције за асинхроно управљање пословима или задацима користећи ред, чиме се смањује стопа употреба меморије у неким деловима апликације.

instagram viewer

Најчешћи пример софтвера за ред порука је РаббитМК. Алати за ред задатака укључују Целери и Булл. Такође можете да конфигуришете РаббитМК да ради као ред задатака. Читајте даље да бисте сазнали о чекању задатака у Ноде.јс користећи Булл.

Шта је БуллМК?

БуллМК (Булл.јс) је библиотека Ноде.јс која се користи за имплементацију редова у Ноде апликацијама. Булл је систем заснован на Редис-у (можда сте боље упознати са Редис-ом као алатом за брзо складиштење података) и то је брза и поуздана опција коју треба размотрити за чекање задатака у Ноде.јс.

Булл можете користити за многе задатке као што су имплементација одложених послова, заказани послови, поновљиви послови, приоритетни редови и још много тога.

Дакле, како можете да користите Булл и Редис за асинхроно покретање Ноде.јс задатака?

Како конфигурисати Булл и Редис за чекање задатака у Ноде.јс

Да бисте започели са стављањем у ред задатака у Ноде.јс са Булл-ом, потребни су вам Ноде.јс и Редис инсталирани на вашој машини. Можете пратити Редис лабораторијски водич за инсталирање Редис-а ако га немате инсталиран.

Први корак у имплементацији Булл-а је да га додате у зависности вашег пројекта покретањем нпм инсталл булл или пређе додати бик у терминалу унутар фасцикле вашег пројекта. Постоји више начина за иницијализацију реда у Булл-у као што је приказано у наставку:

конст Куеуе = захтевају('бик');

// различити начини за иницијализацију реда
// - користећи редис УРЛ стринг
конст емаилКуеуе = Нова у реду('Рег за е-пошту', 'редис://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,
ремовеОнЦомплете: истина
}
};

класаЕмаилКуеуе{
конструктор() {
ово.куеуе = Нова у реду('Рег за е-пошту', РЕДИС_УРЛ, куеуеОптс);

// потрошач
ово.куеуе.процесс('и-мејл обавештење', асинц (е-маилЈоб, готово) => {
конзола.Пријава('задатак обраде обавештења путем е-поште');
чекати емаилХандлер.сендЕмаил (емаилЈоб);
Готово();
})
}

// продуцент
асинц аддЕмаилТоКуеуе (емаилДата) {
// додај задатак са именом 'емаил_нотифицатион' у ред чекања
чекатиово.куеуе.адд('и-мејл обавештење', емаилДата);
конзола.Пријава('е-пошта је додата у ред...');
}
};

извозУобичајено ЕмаилКуеуе;

Када ово имплементирате у Ноде.јс РЕСТ АПИ, приметићете смањење времена одговора крајње тачке регистрације и брже време испоруке е-поште у поређењу са алтернативом.

Редови задатака су вам такође омогућили да самостално рукујете грешкама приликом регистрације и е-поште.

Оптимизација апликација помоћу редова задатака

Редови порука и задатака су одличан начин за побољшање општих перформанси апликација. Такође су веома јефтини и можете их користити у онолико делова апликације колико вам је потребно.

Иако је овај водич користио е-пошту као пример сценарија за руковање задацима који троше меморију са редовима, постоји много других случајева у којима можете применити исте концепте. То укључује тешке операције читања/писања, приказивање висококвалитетних слика или докумената и слање групних обавештења.