Sujuv teavituste kohaletoimetamine hulgi sisestamise toimingute jaoks
Kujutage ette, et haldate süsteemi, kus sadadele töötajatele määratakse erinevate kriteeriumide, näiteks osakonna, palgaastme või kogemuse alusel vautšerid. Iga töötaja teavitamine tõhusalt, ilma süsteemi kitsaskohti tekitamata, on kolossaalne ülesanne. 🔔 See väljakutse muutub veelgi hirmuäratavamaks, kui soovite vältida pistikupesade või küsitlusmehhanismide keerukust.
Selliste stsenaariumide korral ilmnevad serveripoolsed sündmused (SSE) võimsa, kuid lihtsa lahendusena. Kasutades SSE-d oma NestJS-i rakenduses, saate luua reaalajas suhtluskanali, et teavitada konkreetseid töötajate rühmi dünaamiliste kriteeriumide alusel. Näiteks kui müügiosakonnale jagatakse vautšerid, peaksid ainult need töötajad saama teateid, mis tagab täpsed ja sisukad uuendused.
Selle artikli kaudu tutvustame praktilist näidet, mis näitab, kuidas integreerida SSE hulgi sisestamise protsessi NestJS-i abil. Me käime läbi elutsükli alates sündmuste käivitamisest taustaprogrammis kuni värskenduste kuulamiseni esiprogrammis, säilitades samal ajal sujuva jõudluse. 💼
Olenemata sellest, kas arendate personalitööriista või finantsrakendust, selle töövoo mõistmine võimaldab teil edastada isikupärastatud teatisi reaalajas. Teeme lahti SSE lihtsuse ja selle, kuidas see võib teie rakenduse kasutuskogemust tõsta.
Käsk | Kasutusnäide |
---|---|
@Sse | NestJS-i dekoraator, mida kasutatakse serveripoolsete sündmuste (SSE) lõpp-punkti määratlemiseks. Näiteks @Sse('vautšeriga töötaja') seadistab lõpp-punkti kliendile reaalajas värskenduste voogesitamiseks. |
fromEvent | RxJS-i funktsioon, mis teisendab sündmuse, mille kiirgab an Sündmuste tekitaja vaadeldavasse voolu.
Näiteks fromEvent(this.eventEmitter, 'after-added-voucher') kuulab konkreetset sündmust. |
Observable | RxJS-i põhikontseptsioon, mida kasutatakse asünkroonsete andmevoogude haldamiseks.
See on oluline serveripoolsete sündmuste käsitlemiseks NestJS-is, näiteks Vaadeldav<MessageEvent> . |
@InjectQueue | NestJS-i dekoraator, mis sisestab järjekorra eksemplari, mis on kasulik tööde töötlemise haldamiseks teekides nagu Bull.
Näiteks @InjectQueue('allotVoucher') annab juurdepääsu järjekorrale nimega 'allotVoucher'. |
WorkerHost | BullMQ baasklass, mis võimaldab NestJS-is määratleda kohandatud tööprotsessoreid.
Näiteks AllotVoucherConsumer klass laieneb WorkerHost konkreetsete tööde tegemiseks. |
@OnWorkerEvent | Dekoraator kuulas järjekorratöö konkreetseid elutsükli sündmusi.
Näiteks @OnWorkerEvent('lõpetatud') tegeleb töö "lõpetatud" sündmusega. |
createMany | Prisma käsk, mida kasutatakse mitme kirje sisestamiseks andmebaasi korraga.
Näiteks prisma.employeeVoucher.createMany lisab kõigi töötajate vautšerid ühe toiminguga. |
EventSource | JavaScripti API serveri poolt saadetud sündmuste (SSE) vastuvõtmiseks taustaprogrammist.
Näiteks new EventSource('http://localhost/vouchered-employee') loob ühenduse andmete voogesitamiseks. |
add | Bulli järjekordade meetod uue töö järjekorda lisamiseks.
Näiteks allotVoucherQueue.add('allot-vautšer', jobData) planeerib töö töötlemiseks. |
@OnEvent | NestJS-i dekoraator, mis kuulab rakenduses väljastatud konkreetseid sündmusi.
Näiteks @OnEvent('pärast-jaota-vautšer') käivitab selle sündmuse väljastamisel meetodi. |
Tõhusad teatised serveripoolsete sündmuste ja järjekordadega
Pakutud skriptid illustreerivad süsteemi, kus pärast vautšerikirjete hulgi sisestamist andmebaasi saadetakse töötajatele reaalajas teateid. Protsess algab Määra VoucherController, mis paljastab vautšeri eraldamise ülesannete loomise lõpp-punkti. Kui ülesanne on loodud, väljastab see sündmuse nimega järeleralda-vautšer. See sündmus on vajalik järgmiste sammude käivitamiseks, tagades, et süsteem on sündmustepõhine ja modulaarne. See disain võimaldab mured selgelt eraldada, muutes süsteemi paremini hooldatavaks ja skaleeritavamaks. 🎯
Teeninduskihis on Eraldage Voucher Service haldab BullMQ abil ülesannete järjekorda seadmise loogikat. Pärast kättesaamist järeleralda-vautšer sündmuse korral lisab see töö nimega järjekorda jaotusvautšer. See järjekord võimaldab asünkroonset töötlemist, tagades süsteemi reageerimise ka suurte andmekogude töötlemisel. Näiteks kui jagate vautšereid 200 müügiosakonna töötajale, tagab järjekord, et toiming ei blokeeri teisi päringuid. Järjekorra konfiguratsioon sisaldab selliseid valikuid nagu RemoveOnComplete et hoida Redis pärast töö lõpetamist puhtana.
Järjekorratöid töötleb AllotVoucherConsumer klass. Siin rakendatakse asjakohaste töötajate tuvastamise ja vautšerikirjete andmebaasi sisestamise loogikat. Prisma käsk luuaPalju kasutatakse kirjete partii sisestamiseks töötaja Voucher tabel, mis on optimeeritud jõudluse jaoks. Pärast andmebaasi toimingu lõppemist saadetakse uus sündmus, et teavitada abonente. See sündmus tagab, et töötajaid teavitatakse alles pärast hulgi sisestamise edukat töötlemist, lisades teavitamissüsteemi usaldusväärsuse. 🌟
Esiküljel kuulab komponent React serveri kaudu saadetud sündmusi Sündmuse allikas. Kuna töötajaid teavitatakse, värskendatakse nende andmeid kasutajaliideses dünaamiliselt, ilma et oleks vaja lehte värskendada. See lähenemine pakub sujuvat kasutuskogemust, mis sarnaneb tänapäevaste veebirakenduste, näiteks sporditulemuste või sotsiaalmeedia märguannete reaalajas värskendustega. Näiteks ei näe personaliosakonna töötajad müügile mõeldud värskendusi, kuna taustaprogramm filtreerib sündmused täpselt jaotamiskriteeriumide alusel. See spetsiifilisus suurendab nii jõudlust kui ka asjakohasust, luues kasutajakeskse süsteemi. 🖥️
Märguannete hulgi saatmine serveripoolsete sündmustega (SSE) NestJS-is
See lahendus demonstreerib taustapõhist lähenemisviisi NestJS-i kasutamiseks koos Prisma ja serveripoolsete sündmustega (SSE) hulgitoimingute jaoks. See sisaldab sündmustepõhist arhitektuuri ja järjekorrasüsteemi.
// 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 })),
);
}
}
Reaalajas värskendused hulgilisamiseks, kasutades NestJS-i ja Reacti
See esiliidese näide kasutab serveripoolsete sündmuste kuulamiseks ja kasutajaliidese dünaamiliseks värskendamiseks andmete vastuvõtmisel funktsiooni React. See tagab, et töötajad saavad pärast hulgi sisestamist reaalajas märguandeid.
// 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;
Seadmete testimise teatised hulgi sisestamise toimingute jaoks
See Jesti test tagab, et sündmuste emissioon ja teavitusmehhanism töötab NestJS-i serveripoolsete sündmuste taustaprogrammis õigesti.
// 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);
});
});
Reaalajas süsteemide täiustamine SSE-ga NestJS-is
Kuigi oleme uurinud serveripoolsete sündmuste (SSE) rakendamist töötajate teavitamiseks kviitungite eraldamisest, on SSE-d reaalajas süsteemides laiem kasutusjuht. SSE paistab silma stsenaariumides, kus kliendid peavad olema pidevalt kursis serveriandmetega ilma pideva küsitluseta. Näiteks mõelge veebipõhisele jaemüügiplatvormile, mis jälgib kiirmüügi ajal laoseisu värskendusi. SSE-d kasutades saate värskendusi tõhusalt edastada kõigile ühendatud klientidele, tagades, et nad vaatavad uusimaid laoseisusid ilma tarbetu serverikoormuseta. See lähenemisviis tagab skaleeritavuse, säilitades samal ajal kasutajakogemuse sujuvana. 🛒
Kaasades täiustatud järjekorrasüsteemid, nagu BullMQ, nagu me tegime jaotusvautšer järjekord, lisab hulgiandmete töötlemise ülesannetele vastupidavust. Järjekord tagab, et isegi kui server taaskäivitub, jäävad ootel olevad ülesanded puutumata ja töötlemine jätkub. Lisaks saab konfigureerida uuesti proovimise mehhanisme, tagades, et ebaõnnestunud töid (nt andmebaasi ajutise seisaku tõttu) proovitakse uuesti automaatselt. Näiteks kui 300 töötaja jaotamisel osakondade lõikes ilmneb ajutine tõrge, tagab järjekorra vastupidavus, et ühtegi kirjet ei jäeta töötlemata, lisades teie süsteemile töökindlust.
Lisaks reaalajas teavitustele võib SSE täiendada ka e-posti teenuseid üksikasjalikke kokkuvõtteid nõudvate ülesannete jaoks. Pärast kõigi vautšeriteatiste saatmist SSE kaudu saab taustaprogramm asünkroonselt genereerida aruande ja saata juhtidele koondmeili. See mitme kanaliga suhtlus tagab nii kohesed teatised kui ka igakülgsed järelmeetmed, mis vastavad paljudele kasutajaeelistustele. Selline integreerimine suurendab teie süsteemi paindlikkust, luues mitmekülgse kasutuskogemuse. 📧
Korduma kippuvad küsimused SSE kohta NestJSis
- Millised on serveripoolsete sündmuste kasutamise eelised WebSocketsi ees?
- SSE-d on lihtsam rakendada ja see kasutab HTTP-d, muutes selle tulemüürisõbralikuks. Erinevalt WebSocketsist nõuab see ainult ühte ühesuunalist ühendust, mis on tõhus reaalajas värskendamiseks.
- Kas ma saan kasutada @Sse mitme lõpp-punktiga kontrolleris?
- Jah, saate määratleda mitu @Sse lõpp-punktid samas kontrolleris, et teenindada klientidele erinevaid andmevooge vastavalt konkreetsetele vajadustele.
- Kuidas käsitleda vigu järjekorra töötlemisel?
- BullMQ abil saate määratleda uuesti proovimise valikud ja kasutada sündmuste kuulajaid @OnWorkerEvent('failed') vigade logimiseks ja vajadusel tööde ümbertöötlemiseks.
- Kas Prisma oma createMany meetodi tugi tehingute tagasivõtmised?
- Jah, Prisma oma createMany saab sõlmida tehinguga. Kui mõni tehingu toiming ebaõnnestub, tühistatakse kõik toimingud järjepidevuse tagamiseks.
- Mis juhtub, kui klient katkestab ühenduse SSE voo ajal?
- Server lõpetab värskenduste saatmise pärast ühenduse katkemise tuvastamist. Taasühendamise loogikat saate kliendis rakendada, kasutades EventSource API.
- Kas SSE-d saab kasutada kahepoolseks suhtluseks?
- Ei, SSE on ühesuunaline (server-klient). Kahesuunalise suhtluse jaoks kasutage WebSocketsi või HTTP2 vooge.
- Kuidas ma saan NestJS-is SSE lõpp-punkte kaitsta?
- Kasutage kaitsmeid või vahevara, näiteks @UseGuards, et jõustada teie SSE lõpp-punktide autentimine ja autoriseerimine.
- Kas SSE saab töötada klientidega, kes ei kasuta brauserit?
- Jah, iga klient, mis toetab HTTP-d ja sündmuste voogesitust (nt Node.js, cURL), võib tarbida SSE-vooge.
- Kui suur on maksimaalne klientide arv, mis saavad SSE lõpp-punktiga ühenduse luua?
- See sõltub teie serveri konfiguratsioonist ja ressursipiirangutest. Koormuse tasakaalustamine ja rühmitamine võivad aidata skaleerida, et toetada rohkem kliente.
- Kas JSON-i andmeid on võimalik saata SSE kaudu?
- Jah, saate objekte JSON-stringideks järjestada ja neid kasutades saata new MessageEvent NestJS-is.
Tõhusad reaalajas teatised NestJS-is
Reaalajas süsteemide juurutamine kasutades SSE NestJS-is lihtsustab suhtlust serveri ja klientide vahel. See meetod vähendab serveri koormust võrreldes pideva küsitlusega ja võimaldab teatiste täpset sihtimist. Näiteks võib personalitööriist teavitada 200 müügiosakonna töötajat uutest vautšeritest ilma teisi häirimata. 🎯
Selliste tööriistadega nagu BullMQ ja Prisma tagab see seadistus asünkroonse ülesannete töötlemise ja tõhusa andmebaasitoimingud. Sündmuspõhise arhitektuuri paindlikkus muudab selle skaleeritavaks lahenduseks erinevate reaalajas nõudmiste jaoks, suurendades kasutajate kaasamist ja süsteemi töökindlust.
Allikad ja viited
- Üksikasjalik dokumentatsioon kohta NestJS-i raamistik skaleeritavate serveripoolsete rakenduste loomiseks.
- Kasutamise juhend BullMQ Node.js-i rakenduste tööjärjekorra tugevaks haldamiseks.
- Ametlik Prisma dokumentatsioon andmebaasi toimingute ja ORM-i kasutamise jaoks.
- Ülevaateid Serveri poolt saadetud sündmused (SSE) reaalajas kliendi-serveri suhtluseks.
- Praktilised kasutajaliidese rakendusnäited saidilt ReactJS dokumentatsioon interaktiivsete kasutajaliideste loomiseks.