Поједностављена испорука обавештења за операције масовног уметања
Замислите да управљате системом у коме се стотинама запослених додељују ваучери на основу различитих критеријума као што су одељење, разред или искуство. Колосалан је задатак ефикасно обавестити сваког запосленог без изазивања уских грла у систему. 🔔 Овај изазов постаје још застрашујући када желите да избегнете сложеност утичница или механизама за гласање.
У таквим сценаријима, догађаји на страни сервера (ССЕ) се појављују као моћно, али једноставно решење. Коришћењем ССЕ у вашој НестЈС апликацији, можете успоставити комуникациони канал у реалном времену за обавештавање одређених група запослених на основу динамичких критеријума. На пример, када се ваучери додељују одељењу продаје, само ти запослени треба да примају обавештења, обезбеђујући прецизна и смислена ажурирања.
Кроз овај чланак ћемо заронити у практичан пример који показује како интегрисати ССЕ у процес масовног уметања користећи НестЈС. Прошетаћемо кроз животни циклус, од покретања догађаја у бацкенд-у до слушања ажурирања на фронтенду, а све уз одржавање беспрекорних перформанси. 💼
Без обзира да ли развијате ХР алат или финансијску апликацију, разумевање овог тока посла ће вам омогућити да испоручујете персонализована обавештења у реалном времену. Хајде да откријемо једноставност ССЕ-а и како он може да побољша корисничко искуство ваше апликације.
Цомманд | Пример употребе |
---|---|
@Sse | НестЈС декоратор који се користи за дефинисање крајње тачке догађаја на страни сервера (ССЕ). на пример, @Ссе('воуцхеред-емплоиее') поставља крајњу тачку за стримовање ажурирања у реалном времену до клијента. |
fromEvent | Функција из РкЈС која конвертује догађај који емитује ан ЕвентЕмиттер у видљиви ток.
на пример, фромЕвент(тхис.евентЕмиттер, 'након доданог-ваучера') слуша за одређени догађај. |
Observable | Основни концепт из РкЈС-а који се користи за управљање асинхроним токовима података.
Неопходно је за руковање догађајима на страни сервера у НестЈС-у, нпр Опсервабле<MessageEvent> . |
@InjectQueue | НестЈС декоратер који убацује инстанцу реда, корисно за управљање обрадом послова са библиотекама као што је Булл.
на пример, @ИњецтКуеуе('аллотВоуцхер') пружа приступ реду под називом 'аллотВоуцхер'. |
WorkerHost | Основна класа из БуллМК-а која омогућава дефинисање прилагођених процесора послова у НестЈС-у.
На пример, тхе АллотВоуцхерЦонсумер класа проширује ВоркерХост за обављање одређених послова. |
@OnWorkerEvent | Декоратор је користио за слушање специфичних догађаја животног циклуса посла у реду чекања.
на пример, @ОнВоркерЕвент('цомплетед') обрађује догађај "завршеног" посла. |
createMany | Присма команда која се користи за уметање више записа у базу података одједном.
на пример, присма.емплоиееВоуцхер.цреатеМани додаје ваучере свих запослених у једној операцији. |
EventSource | ЈаваСцрипт АПИ за примање догађаја послатих сервером (ССЕ) из позадинског дела.
на пример, нев ЕвентСоурце('хттп://лоцалхост/воуцхеред-емплоиее') успоставља везу за стримовање података. |
add | Метод из Булл редова за додавање новог посла у ред.
на пример, аллотВоуцхерКуеуе.адд('аллот-воуцхер', јобДата) заказује посао за обраду. |
@OnEvent | НестЈС декоратер који ослушкује специфичне догађаје емитоване унутар апликације.
на пример, @ОнЕвент('ваучер после доделе') покреће метод када се емитује овај догађај. |
Ефикасна обавештења са догађајима и редовима на страни сервера
Достављене скрипте илуструју систем где се обавештења у реалном времену шаљу запосленима након масовног убацивања записа ваучера у базу података. Процес почиње у АллоцатеВоуцхерЦонтроллер, који открива крајњу тачку за креирање задатака алокације ваучера. Када се креира задатак, он емитује догађај под називом афтер-алоцате-вауцхер. Овај догађај је од суштинског значаја за покретање наредних корака, осигуравајући да је систем вођен догађајима и модуларан. Овај дизајн омогућава јасно раздвајање брига, чинећи систем лакшим за одржавање и скалабилнијим. 🎯
У слоју услуге, АллоцатеВоуцхерСервице управља логиком за стављање у ред задатака користећи БуллМК. Након пријема афтер-алоцате-вауцхер догађај, додаје посао у ред под називом алот-ваучер. Овај ред омогућава асинхрону обраду, обезбеђујући да систем остане одзиван чак и када обрађује велике скупове података. На пример, ако доделите ваучере за 200 запослених у одељењу продаје, ред обезбеђује да операција не блокира друге захтеве. Конфигурација реда укључује опције као што су ремовеОнЦомплете да Редис буде чист након завршетка посла.
Послове у реду обрађује АллотВоуцхерЦонсумер класе. Овде је имплементирана логика за идентификацију релевантних запослених и убацивање евиденције ваучера у базу података. Команда Присма цреатеМани се користи за групно уметање записа у ЕмплоиееВоуцхер табела, која је оптимизована за перформансе. Након што се операција базе података заврши, емитује се други догађај да обавести претплатнике. Овај догађај обезбеђује да запослени буду обавештени тек након што је групно уметање успешно обрађено, додајући поузданост систему обавештавања. 🌟
На фронтенд-у, Реацт компонента слуша догађаје које шаље сервер преко ЕвентСоурце. Како запослени буду обавештени, њихови детаљи се динамички ажурирају у корисничком интерфејсу без потребе за освежавањем странице. Овај приступ пружа беспрекорно корисничко искуство, слично ажурирањима у реалном времену која се виде у модерним веб апликацијама као што су резултати уживо или обавештења на друштвеним мрежама. На пример, запослени у одељењу за људске ресурсе неће видети ажурирања намењена продаји, пошто позадина прецизно филтрира догађаје на основу критеријума алокације. Ова специфичност побољшава и перформансе и релевантност, стварајући систем фокусиран на корисника. 🖥
Групно слање обавештења са догађајима на страни сервера (ССЕ) у НестЈС-у
Ово решење показује позадински приступ коришћењу НестЈС-а са Присма-ом и догађајима на страни сервера (ССЕ) за групне операције. Укључује архитектуру вођену догађајима и систем чекања.
// Backend: AllocateVoucherController
import { Controller, Post, Body, Sse, OnEvent } from '@nestjs/common';
import { AllocateVoucherService } from './allocate-voucher.service';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { Observable } from 'rxjs';
import { map, fromEvent } from 'rxjs';
@Controller('allocate-voucher')
export class AllocateVoucherController {
constructor(
private readonly allocateVoucherService: AllocateVoucherService,
private readonly eventEmitter: EventEmitter2
) {}
@Post()
async create(@Body() createDto: any) {
const result = await this.allocateVoucherService.create(createDto);
return result;
}
@Sse('vouchered-employee')
updatedEmployeeEvent(): Observable<MessageEvent> {
return fromEvent(this.eventEmitter, 'after-added-voucher').pipe(
map((data) => new MessageEvent('after-added-voucher', { data })),
);
}
}
Ажурирања у реалном времену за масовне уметке користећи НестЈС и Реацт
Овај пример фронтенда користи Реацт за слушање догађаја на страни сервера и динамички ажурирање корисничког интерфејса како се подаци примају. Обезбеђује да запослени буду обавештени у реалном времену након масовних уметања.
// Frontend: React Component for SSE
import React, { useEffect, useState } from 'react';
const EmployeeUpdates = () => {
const [employees, setEmployees] = useState([]);
useEffect(() => {
const eventSource = new EventSource('http://localhost:3000/allocate-voucher/vouchered-employee');
eventSource.onmessage = (event) => {
const newEmployee = JSON.parse(event.data);
setEmployees((prev) => [...prev, newEmployee]);
};
return () => eventSource.close();
}, []);
return (
<table>
<thead>
<tr><th>Name</th><th>Voucher</th></tr>
</thead>
<tbody>
{employees.map((emp) => (
<tr key={emp.id}><td>{emp.name}</td><td>{emp.voucher}</td></tr>
))}
</tbody>
</table>
);
};
export default EmployeeUpdates;
Обавештења о јединичном тестирању за операције масовног уметања
Овај Јест тест обезбеђује да механизам емитовања догађаја и обавештења ради исправно у позадини за догађаје на страни сервера у НестЈС-у.
// Jest Test: AllocateVoucherService
import { Test, TestingModule } from '@nestjs/testing';
import { AllocateVoucherService } from './allocate-voucher.service';
import { EventEmitter2 } from '@nestjs/event-emitter';
describe('AllocateVoucherService', () => {
let service: AllocateVoucherService;
let eventEmitter: EventEmitter2;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [AllocateVoucherService, EventEmitter2],
}).compile();
service = module.get(AllocateVoucherService);
eventEmitter = module.get(EventEmitter2);
});
it('should emit after-allocate-voucher event', async () => {
jest.spyOn(eventEmitter, 'emit');
const result = await service.create({ someData: 'test' });
expect(eventEmitter.emit).toHaveBeenCalledWith('after-allocate-voucher', result);
});
});
Побољшање система у реалном времену са ССЕ у НестЈС-у
Иако смо истражили примену догађаја на страни сервера (ССЕ) за обавештавање запослених о додели ваучера, постоји шири случај употребе ССЕ у системима у реалном времену. ССЕ блиста у сценаријима у којима клијенти морају да буду ажурирани са подацима сервера без сталног анкетирања. На пример, размислите о онлајн малопродајној платформи која прати ажурирања залиха уживо током флеш распродаје. Користећи ССЕ, можете ефикасно да шаљете ажурирања свим повезаним клијентима, осигуравајући да виде најновије нивое залиха без непотребног оптерећења сервера. Овај приступ обезбеђује скалабилност, а истовремено одржава корисничко искуство беспрекорним. 🛒
Укључујући напредне системе чекања као што је БуллМК, као што смо урадили са алот-ваучер ред чекања, додаје робусност задацима обраде масовних података. Ред обезбеђује да чак и ако дође до поновног покретања сервера, задаци на чекању остају нетакнути, а обрада се наставља. Поред тога, могу се конфигурисати механизми поновног покушаја, обезбеђујући да се неуспели послови (нпр. због привременог застоја у бази података) поново покушају аутоматски. На пример, ако расподела за 300 запослених у одељењима наиђе на привремену грешку, отпорност реда обезбеђује да ниједан запис не остане необрађен, додајући поузданост вашем систему.
Осим обавештења у реалном времену, ССЕ такође може да допуни услуге е-поште за задатке који захтевају детаљне сажетке. Након што се сва обавештења о ваучерима пошаљу преко ССЕ-а, позадина може асинхроно да генерише извештај и пошаље консолидовану е-пошту менаџерима. Ова вишеканална комуникација обезбеђује и тренутна обавештења и свеобухватно праћење, задовољавајући широк спектар преференција корисника. Таква интеграција побољшава флексибилност вашег система, стварајући добро заокружено корисничко искуство. 📧
Често постављана питања о ССЕ-у у НестЈС-у
- Које су предности коришћења догађаја на страни сервера у односу на ВебСоцкетс?
- ССЕ је једноставнији за имплементацију и користи ХТТП, што га чини погодним за заштитни зид. За разлику од ВебСоцкетс-а, захтева само једну једносмерну везу, која је ефикасна за ажурирања у реалном времену.
- Могу ли да користим @Sse са више крајњих тачака у контролеру?
- Да, можете дефинисати више @Sse крајње тачке у истом контролеру за опслуживање различитих токова података клијентима на основу специфичних потреба.
- Како да поступам са грешкама током обраде реда?
- Са БуллМК, можете дефинисати опције поновног покушаја и користити слушаоце догађаја као што је @OnWorkerEvent('failed') за евидентирање грешака и поновну обраду послова ако је потребно.
- Да ли Присма'с createMany метод подршке враћања трансакција?
- Да, Присма'с createMany може бити умотано у трансакцију. Ако било која операција у трансакцији не успе, све операције се поништавају ради доследности.
- Шта се дешава ако клијент прекине везу током ССЕ стрима?
- Сервер престаје да шаље ажурирања када открије прекид везе. Можете имплементирати логику поновног повезивања на клијенту користећи EventSource АПИ.
- Да ли се ССЕ може користити за двосмерну комуникацију?
- Не, ССЕ је једносмеран (од сервера до клијента). За двосмерну комуникацију користите ВебСоцкетс или ХТТП2 токове.
- Како да обезбедим ССЕ крајње тачке у НестЈС-у?
- Користите чуваре или међуверзије, нпр @UseGuards, да бисте применили аутентификацију и ауторизацију за ваше ССЕ крајње тачке.
- Може ли ССЕ да ради са клијентима који не користе претраживач?
- Да, сваки клијент који подржава ХТТП и стриминг догађаја (нпр. Ноде.јс, цУРЛ) може да користи ССЕ стримове.
- Колики је максималан број клијената који се могу повезати на ССЕ крајњу тачку?
- Ово зависи од конфигурације вашег сервера и ограничења ресурса. Балансирање оптерећења и груписање могу помоћи у скалирању како би се подржало више клијената.
- Да ли је могуће слати ЈСОН податке преко ССЕ-а?
- Да, можете серијализирати објекте у ЈСОН стрингове и послати их користећи new MessageEvent у НестЈС.
Ефикасна обавештења у реалном времену у НестЈС-у
Имплементација система у реалном времену коришћењем ССЕ у НестЈС-у поједностављује комуникацију између сервера и клијената. Овај метод смањује оптерећење сервера у поређењу са сталним анкетирањем и омогућава прецизно циљање за обавештења. На пример, ХР алат може да обавести 200 запослених у продаји о новим ваучерима без ометања других. 🎯
Са алатима као што су БуллМК и Присма, ово подешавање обезбеђује асинхрону обраду задатака и ефикасне операције базе података. Флексибилност архитектуре засноване на догађајима чини је скалабилним решењем за различите захтеве у реалном времену, повећавајући ангажовање корисника и поузданост система.
Извори и референце
- Детаљна документација о НестЈС Фрамеворк за изградњу скалабилних апликација на страни сервера.
- Водич за коришћење БуллМК за робусно управљање редовима послова у Ноде.јс апликацијама.
- Службено Присма документација за операције базе података и коришћење ОРМ-а.
- Инсигхтс он Догађаји послани сервером (ССЕ) за комуникацију клијент-сервер у реалном времену.
- Практични примери имплементације фронтенд-а из РеацтЈС документација за изградњу интерактивних корисничких интерфејса.