Pojednostavljena dostava obavijesti za skupne operacije umetanja
Zamislite da upravljate sustavom u kojem stotine zaposlenika dobivaju bonove na temelju različitih kriterija kao što su odjel, ocjena ili iskustvo. Kolosalan je zadatak učinkovito obavijestiti svakog zaposlenika bez izazivanja uskih grla u sustavu. 🔔 Ovaj izazov postaje još zastrašujući kada želite izbjeći složenost utičnica ili mehanizama glasanja.
U takvim scenarijima, događaji na strani poslužitelja (SSE) pojavljuju se kao moćno, ali jednostavno rješenje. Iskorištavanjem SSE-a u vašoj NestJS aplikaciji možete uspostaviti komunikacijski kanal u stvarnom vremenu za obavještavanje određenih skupina zaposlenika na temelju dinamičkih kriterija. Na primjer, kada su vaučeri dodijeljeni odjelu prodaje, samo bi ti zaposlenici trebali primati obavijesti, čime se osiguravaju precizna i smislena ažuriranja.
Kroz ovaj članak, zaronit ćemo u praktičan primjer koji pokazuje kako integrirati SSE u proces skupnog umetanja pomoću NestJS-a. Proći ćemo kroz životni ciklus, od pokretanja događaja u pozadini do osluškivanja ažuriranja na sučelju, uz održavanje besprijekorne izvedbe. 💼
Bilo da razvijate HR alat ili aplikaciju za financije, razumijevanje ovog tijeka rada omogućit će vam isporuku personaliziranih obavijesti u stvarnom vremenu. Razotkrijmo jednostavnost SSE-a i kako on može poboljšati korisničko iskustvo vaše aplikacije.
Naredba | Primjer upotrebe |
---|---|
@Sse | NestJS dekorater koji se koristi za definiranje krajnje točke događaja na strani poslužitelja (SSE). Na primjer, @Sse('vauchered-employee') postavlja krajnju točku za strujanje ažuriranja u stvarnom vremenu klijentu. |
fromEvent | Funkcija iz RxJS-a koja pretvara događaj koji emitira EventEmitter u vidljiv tok.
Na primjer, fromEvent(this.eventEmitter, 'after-added-voucher') osluškuje određeni događaj. |
Observable | Temeljni koncept iz RxJS-a koji se koristi za upravljanje asinkronim tokovima podataka.
Neophodno je za rukovanje događajima na strani poslužitelja u NestJS-u, npr Uočljiv<MessageEvent> . |
@InjectQueue | NestJS dekorater koji ubacuje instancu čekanja, koristan za upravljanje obradom poslova s bibliotekama kao što je Bull.
Na primjer, @InjectQueue('allotVoucher') omogućuje pristup redu pod nazivom 'allotVoucher'. |
WorkerHost | Osnovna klasa iz BullMQ-a koja omogućuje definiranje prilagođenih procesora poslova u NestJS-u.
Na primjer, AllotVoucherConsumer razred se proteže WorkerHost za obavljanje specifičnih poslova. |
@OnWorkerEvent | Dekorater je slušao specifične događaje životnog ciklusa posla u redu čekanja.
Na primjer, @OnWorkerEvent('dovršeno') obrađuje "završen" događaj posla. |
createMany | Prisma naredba koja se koristi za umetanje više zapisa u bazu podataka odjednom.
Na primjer, prisma.employee Voucher.createMany dodaje sve kupone zaposlenika u jednoj operaciji. |
EventSource | JavaScript API za primanje događaja poslanih s poslužitelja (SSE) iz pozadine.
Na primjer, novi EventSource('http://localhost/vouchered-employee') uspostavlja vezu za strujanje podataka. |
add | Metoda iz Bull queues za dodavanje novog posla u red.
Na primjer, allotVoucherQueue.add('allot-voucher', jobData) rasporedi posao za obradu. |
@OnEvent | NestJS dekorater koji osluškuje specifične događaje emitirane unutar aplikacije.
Na primjer, @OnEvent('after-allocate-voucher') pokreće metodu kada se ovaj događaj emitira. |
Učinkovite obavijesti s događajima na strani poslužitelja i redovima čekanja
Pružene skripte ilustriraju sustav u kojem se zaposlenicima šalju obavijesti u stvarnom vremenu nakon skupnog umetanja zapisa o vaučeru u bazu podataka. Proces počinje u AllocateVoucherController, koji otkriva krajnju točku za kreiranje zadataka dodjele vaučera. Kada se zadatak kreira, emitira događaj pod nazivom nakon-dodijeliti-vaučer. Ovaj događaj je bitan za pokretanje sljedećih koraka, osiguravajući da je sustav vođen događajima i modularan. Ovaj dizajn omogućuje jasno odvajanje problema, čineći sustav lakšim za održavanje i skalabilnijim. 🎯
U sloju usluge, AllocateVoucherService upravlja logikom za stavljanje zadataka u red čekanja koristeći BullMQ. Nakon primitka nakon-dodijeliti-vaučer događaj, dodaje posao u red pod nazivom alot-voucher. Ovaj red omogućuje asinkronu obradu, osiguravajući da sustav i dalje reagira čak i kada obrađuje velike skupove podataka. Na primjer, ako dodijelite kupone za 200 zaposlenika u odjelu prodaje, red čekanja osigurava da operacija ne blokira druge zahtjeve. Konfiguracija reda čekanja uključuje opcije poput uklonitiNaDovršetku kako bi Redis bio čist nakon završetka posla.
Poslove u redu čekanja obrađuje AllotVoucherConsumer razreda. Ovdje je implementirana logika za identifikaciju relevantnih zaposlenika i umetanje zapisa vaučera u bazu podataka. Naredba Prisma createMany koristi se za skupno umetanje zapisa u vaučer zaposlenika stol, koji je optimiziran za performanse. Nakon završetka operacije baze podataka, emitira se još jedan događaj za obavještavanje pretplatnika. Ovaj događaj osigurava da su zaposlenici obaviješteni tek nakon što je skupno umetanje uspješno obrađeno, dodajući pouzdanost sustavu obavijesti. 🌟
Na sučelju, komponenta React sluša događaje poslane s poslužitelja putem EventSource. Kako zaposlenici budu obaviješteni, njihovi se podaci dinamički ažuriraju u korisničkom sučelju bez potrebe za osvježavanjem stranice. Ovaj pristup pruža besprijekorno korisničko iskustvo, slično ažuriranju u stvarnom vremenu koje se može vidjeti u modernim web aplikacijama poput sportskih rezultata uživo ili obavijesti društvenih medija. Na primjer, zaposlenici u odjelu ljudskih resursa neće vidjeti ažuriranja namijenjena prodaji, budući da backend precizno filtrira događaje na temelju kriterija dodjele. Ova specifičnost poboljšava i izvedbu i relevantnost, stvarajući sustav usmjeren na korisnika. 🖥️
Skupno slanje obavijesti s događajima na strani poslužitelja (SSE) u NestJS-u
Ovo rješenje pokazuje pozadinski pristup korištenju NestJS-a s Prismom i događajima na strani poslužitelja (SSE) za skupne operacije. Uključuje arhitekturu vođenu događajima i sustav čekanja.
// 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 })),
);
}
}
Ažuriranja u stvarnom vremenu za skupna umetanja pomoću NestJS-a i Reacta
Ovaj primjer sučelja koristi React za slušanje događaja na strani poslužitelja i dinamičko ažuriranje korisničkog sučelja kako se podaci primaju. Osigurava da zaposlenici budu obaviješteni u stvarnom vremenu nakon masovnog umetanja.
// 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;
Obavijesti o testiranju jedinice za operacije masovnog umetanja
Ovaj Jest test osigurava da emisija događaja i mehanizam obavijesti ispravno rade u pozadini za događaje na strani poslužitelja u NestJS-u.
// 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);
});
});
Poboljšanje sustava u stvarnom vremenu sa SSE u NestJS
Iako smo istražili implementaciju događaja na strani poslužitelja (SSE) za obavještavanje zaposlenika o dodjeli vaučera, postoji šira upotreba SSE-a u sustavima u stvarnom vremenu. SSE blista u scenarijima u kojima klijenti moraju biti ažurirani s podacima poslužitelja bez stalnog prozivanja. Na primjer, razmislite o online maloprodajnoj platformi koja prati ažuriranja inventara uživo tijekom brze prodaje. Koristeći SSE, možete učinkovito slati ažuriranja svim povezanim klijentima, osiguravajući da vide najnovije razine zaliha bez nepotrebnog opterećenja poslužitelja. Ovaj pristup osigurava skalabilnost, a istovremeno održava besprijekorno korisničko iskustvo. 🛒
Uključujući napredne sustave čekanja kao što je BullMQ, kao što smo učinili s alot-voucher čekanja, dodaje robusnost zadacima masovne obrade podataka. Red čekanja osigurava da čak i ako dođe do ponovnog pokretanja poslužitelja, zadaci na čekanju ostaju netaknuti, a obrada se nastavlja. Dodatno, mehanizmi ponovnog pokušaja mogu se konfigurirati, osiguravajući automatski ponovni pokušaj neuspjelih poslova (npr. zbog privremenog prekida rada baze podataka). Na primjer, ako dodjela za 300 zaposlenika u različitim odjelima naiđe na privremenu pogrešku, otpornost reda čekanja osigurava da nijedan zapis ne ostane neobrađen, čime se povećava pouzdanost vašeg sustava.
Osim obavijesti u stvarnom vremenu, SSE također može nadopuniti usluge e-pošte za zadatke koji zahtijevaju detaljne sažetke. Nakon što se sve obavijesti o vaučeru pošalju putem SSE-a, pozadina može asinkrono generirati izvješće i poslati konsolidiranu e-poštu upraviteljima. Ova višekanalna komunikacija osigurava i trenutne obavijesti i opsežna praćenja, zadovoljavajući širok raspon korisničkih preferencija. Takva integracija povećava fleksibilnost vašeg sustava, stvarajući dobro zaokruženo korisničko iskustvo. 📧
Često postavljana pitanja o SSE-u u NestJS-u
- Koje su prednosti korištenja događaja na strani poslužitelja u odnosu na WebSockets?
- SSE je jednostavniji za implementaciju i koristi HTTP, što ga čini prilagođenim vatrozidu. Za razliku od WebSockets, zahtijeva samo jednu jednosmjernu vezu, koja je učinkovita za ažuriranja u stvarnom vremenu.
- Mogu li koristiti @Sse s više krajnjih točaka u kontroleru?
- Da, možete definirati više @Sse krajnje točke u istom kontroleru za posluživanje različitih tokova podataka klijentima na temelju specifičnih potreba.
- Kako se mogu nositi s pogreškama tijekom obrade čekanja?
- Uz BullMQ možete definirati opcije ponovnog pokušaja i koristiti slušatelje događaja poput @OnWorkerEvent('failed') zabilježiti pogreške i ponovno obraditi poslove ako je potrebno.
- Da li Prisma's createMany metoda podrške vraćanja transakcija?
- Da, Prismina createMany može se zamotati u transakciju. Ako bilo koja operacija u transakciji ne uspije, sve se operacije vraćaju unatrag radi dosljednosti.
- Što se događa ako klijent prekine vezu tijekom SSE streama?
- Poslužitelj prestaje slati ažuriranja nakon što otkrije prekid veze. Možete implementirati logiku ponovnog povezivanja na klijentu pomoću EventSource API.
- Može li se SSE koristiti za dvosmjernu komunikaciju?
- Ne, SSE je jednosmjeran (poslužitelj-klijent). Za dvosmjernu komunikaciju koristite WebSockets ili HTTP2 streamove.
- Kako mogu osigurati SSE krajnje točke u NestJS-u?
- Koristite štitnike ili posrednike, npr @UseGuards, za provođenje provjere autentičnosti i autorizacije za vaše SSE krajnje točke.
- Može li SSE raditi s klijentima koji nisu preglednici?
- Da, svaki klijent koji podržava HTTP i streaming događaja (npr. Node.js, cURL) može koristiti SSE streamove.
- Koji je najveći broj klijenata koji se mogu spojiti na SSE krajnju točku?
- To ovisi o konfiguraciji vašeg poslužitelja i ograničenjima resursa. Balansiranje opterećenja i klasteriranje mogu pomoći u skaliranju za podršku više klijenata.
- Je li moguće slati JSON podatke preko SSE-a?
- Da, možete serijalizirati objekte u nizove JSON i poslati ih pomoću new MessageEvent u NestJS.
Učinkovite obavijesti u stvarnom vremenu u NestJS-u
Implementacija sustava u stvarnom vremenu korištenjem JJI u NestJS-u pojednostavljuje komunikaciju između poslužitelja i klijenata. Ova metoda smanjuje opterećenje poslužitelja u usporedbi sa stalnim prozivanjem i omogućuje precizno ciljanje za obavijesti. Na primjer, HR alat može obavijestiti 200 zaposlenika u prodaji o novim vaučerima bez ometanja ostalih. 🎯
S alatima kao što su BullMQ i Prisma, ova postavka osigurava asinkronu obradu zadataka i učinkovite operacije baze podataka. Fleksibilnost arhitekture temeljene na događajima čini je skalabilnim rješenjem za različite zahtjeve u stvarnom vremenu, povećavajući angažman korisnika i pouzdanost sustava.
Izvori i reference
- Detaljna dokumentacija na NestJS okvir za izgradnju skalabilnih aplikacija na strani poslužitelja.
- Vodič za korištenje BullMQ za robusno upravljanje redom poslova u Node.js aplikacijama.
- Službenik Prisma dokumentacija za rad s bazom podataka i korištenje ORM-a.
- Uvidi na Događaji poslani s poslužitelja (SSE) za komunikaciju klijent-poslužitelj u stvarnom vremenu.
- Primjeri praktične implementacije sučelja iz ReactJS dokumentacija za izgradnju interaktivnih korisničkih sučelja.