Racionalizēta paziņojumu piegāde lielapjoma ievietošanas darbībām
Iedomājieties, ka pārvaldāt sistēmu, kurā simtiem darbinieku tiek piešķirti kuponi, pamatojoties uz dažādiem kritērijiem, piemēram, departamentu, pakāpi vai pieredzi. Tas ir milzīgs uzdevums efektīvi informēt katru darbinieku, neradot vājās vietas sistēmā. 🔔 Šis izaicinājums kļūst vēl biedējošāks, ja vēlaties izvairīties no ligzdas vai aptaujas mehānismu sarežģītības.
Šādos scenārijos servera puses notikumi (SSE) parādās kā spēcīgs, taču vienkāršs risinājums. Izmantojot SSE savā NestJS lietojumprogrammā, varat izveidot reāllaika saziņas kanālu, lai informētu konkrētas darbinieku grupas, pamatojoties uz dinamiskiem kritērijiem. Piemēram, kad pārdošanas nodaļai tiek piešķirti vaučeri, paziņojumi jāsaņem tikai tiem darbiniekiem, kas nodrošina precīzus un jēgpilnus atjauninājumus.
Šajā rakstā mēs iedziļināsimies praktiskā piemērā, kas parāda, kā integrēt SSE lielapjoma ievietošanas procesā, izmantojot NestJS. Mēs izstaigāsim dzīves ciklu, sākot no notikumu aktivizēšanas aizmugursistēmā līdz atjauninājumu klausīšanai priekšgalā, vienlaikus saglabājot nevainojamu veiktspēju. 💼
Neatkarīgi no tā, vai izstrādājat HR rīku vai finanšu lietotni, šīs darbplūsmas izpratne ļaus jums sniegt personalizētus paziņojumus reāllaikā. Atklāsim SSE vienkāršību un to, kā tas var uzlabot jūsu lietojumprogrammas lietošanas pieredzi.
Komanda | Lietošanas piemērs |
---|---|
@Sse | NestJS dekorators, ko izmanto, lai definētu servera puses notikumu (SSE) galapunktu. Piemēram, @Sse('vauchered-darbinieks') iestata galapunktu, lai straumētu reāllaika atjauninājumus klientam. |
fromEvent | Funkcija no RxJS, kas pārvērš notikumu, ko emitē an EventEmitter novērojamā straumē.
Piemēram, fromEvent(this.eventEmitter, 'pēc pievienošanas-kupons') klausās konkrētu notikumu. |
Observable | RxJS pamatkoncepcija, ko izmanto asinhrono datu straumju pārvaldībai.
Tas ir būtiski, lai apstrādātu servera puses notikumus, piemēram, NestJS Novērojams<MessageEvent> . |
@InjectQueue | NestJS dekorētājs, kas ievada rindas gadījumu, kas ir noderīgs, lai pārvaldītu darbu apstrādi ar tādām bibliotēkām kā Bull.
Piemēram, @InjectQueue('allotVoucher') nodrošina piekļuvi rindai ar nosaukumu "allotVoucher". |
WorkerHost | BullMQ bāzes klase, kas ļauj definēt pielāgotus darba procesorus NestJS.
Piemēram, AllotVoucherConsumer klase pagarinās WorkerHost veikt konkrētus darbus. |
@OnWorkerEvent | Dekorators mēdza noklausīties konkrētus rindas darba dzīves cikla notikumus.
Piemēram, @OnWorkerEvent('pabeigts') apstrādā darba "pabeigto" notikumu. |
createMany | Prisma komanda, ko izmanto, lai vienlaikus ievietotu vairākus ierakstus datu bāzē.
Piemēram, prisma.employeeVoucher.createMany pievieno visu darbinieku kuponus vienā darbībā. |
EventSource | JavaScript API servera sūtītu notikumu (SSE) saņemšanai no aizmugursistēmas.
Piemēram, new EventSource ('http://localhost/vouchered-employee') izveido savienojumu datu straumēšanai. |
add | Bull rindas metode, lai rindai pievienotu jaunu darbu.
Piemēram, allotVoucherQueue.add('allot-vaucher', jobData) ieplāno darbu apstrādei. |
@OnEvent | NestJS dekorators, kas klausās konkrētus notikumus, kas tiek izvadīti lietojumprogrammā.
Piemēram, @OnEvent('pēc-piešķirt-vaučeru') aktivizē metodi, kad šis notikums tiek izvadīts. |
Efektīvi paziņojumi ar servera puses notikumiem un rindām
Piedāvātie skripti ilustrē sistēmu, kurā reāllaika paziņojumi tiek nosūtīti darbiniekiem pēc kuponu ierakstu lielapjoma ievietošanas datu bāzē. Process sākas PiešķirtVoucherController, kas atklāj galapunktu kuponu piešķiršanas uzdevumu izveidei. Kad uzdevums ir izveidots, tas izstaro notikumu ar nosaukumu pēcpiešķiršanas kupons. Šis notikums ir būtisks, lai aktivizētu turpmākās darbības, nodrošinot, ka sistēma ir notikuma vadīta un modulāra. Šis dizains ļauj skaidri nodalīt problēmas, padarot sistēmu apkopjamāku un mērogojamāku. 🎯
Pakalpojuma slānī PiešķirtVoucherService apstrādā loģiku uzdevumu salikšanai rindā, izmantojot BullMQ. Pēc saņemšanas pēcpiešķiršanas kupons notikumu, tas pievieno darbu nosauktajai rindai piešķīruma kupons. Šī rinda ļauj veikt asinhronu apstrādi, nodrošinot, ka sistēma paliek atsaucīga pat apstrādājot lielas datu kopas. Piemēram, ja piešķirat kuponus 200 pārdošanas nodaļas darbiniekiem, rinda nodrošina, ka darbība nebloķē citus pieprasījumus. Rindas konfigurācijā ir iekļautas tādas opcijas kā RemoveOnComplete lai pēc darba pabeigšanas Redis būtu tīrs.
Rindas darbus apstrādā AllotVoucherConsumer klasē. Šeit tiek realizēta loģika attiecīgo darbinieku identificēšanai un vaučeru ierakstu ievietošanai datu bāzē. Prisma komanda izveidotDaudzi tiek izmantots, lai sērijveidā ievietotu ierakstus darbinieka kupons tabula, kas ir optimizēta veiktspējai. Kad datu bāzes darbība ir pabeigta, tiek izvadīts vēl viens notikums, lai informētu abonentus. Šis notikums nodrošina, ka darbinieki tiek informēti tikai pēc tam, kad lielapjoma ievietošana ir veiksmīgi apstrādāta, tādējādi palielinot paziņošanas sistēmas uzticamību. 🌟
Priekšgalā komponents React klausās servera nosūtītos notikumus, izmantojot an EventSource. Kad darbinieki tiek informēti, viņu informācija tiek dinamiski atjaunināta lietotāja saskarnē, neprasot lapas atsvaidzināšanu. Šī pieeja nodrošina nevainojamu lietotāja pieredzi, kas ir līdzīga reāllaika atjauninājumiem, kas redzami modernās tīmekļa lietojumprogrammās, piemēram, tiešraides sporta rezultātos vai sociālo mediju paziņojumos. Piemēram, personāla nodaļas darbinieki neredzēs atjauninājumus, kas paredzēti pārdošanai, jo aizmugursistēma precīzi filtrē notikumus, pamatojoties uz piešķiršanas kritērijiem. Šī specifika uzlabo gan veiktspēju, gan atbilstību, radot uz lietotāju vērstu sistēmu. 🖥️
Paziņojumu lielapjoma sūtīšana, izmantojot servera puses notikumus (SSE) NestJS
Šis risinājums demonstrē aizmugursistēmas pieeju NestJS izmantošanai ar Prisma un servera puses notikumiem (SSE) lielapjoma operācijām. Tas ietver uz notikumu balstītu arhitektūru un rindu sistēmu.
// 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 })),
);
}
}
Reāllaika atjauninājumi lielapjoma ievietošanai, izmantojot NestJS un React
Šajā priekšgala piemērā tiek izmantota funkcija React, lai klausītos servera puses notikumus un dinamiski atjauninātu lietotāja saskarni, tiklīdz tiek saņemti dati. Tas nodrošina, ka darbinieki saņem paziņojumus reāllaikā pēc lielapjoma ievietošanas.
// 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;
Paziņojumi par vienību testēšanu lielapjoma ievietošanas darbībām
Šis Jest tests nodrošina, ka notikumu emisijas un paziņošanas mehānisms pareizi darbojas servera puses notikumu aizmugursistēmā NestJS.
// 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);
});
});
Reāllaika sistēmu uzlabošana ar SSE pakalpojumā NestJS
Lai gan mēs esam izpētījuši servera puses notikumu (SSE) ieviešanu, lai informētu darbiniekus par kuponu piešķiršanu, SSE ir plašāks izmantošanas gadījums reāllaika sistēmās. SSE darbojas gadījumos, kad klientiem ir jāsaglabā jaunākie servera dati bez pastāvīgas aptaujas. Piemēram, padomājiet par tiešsaistes mazumtirdzniecības platformu, kas izseko aktuālus krājumu atjauninājumus ātrās izpārdošanas laikā. Izmantojot SSE, varat efektīvi nosūtīt atjauninājumus visiem pievienotajiem klientiem, nodrošinot, ka tie skatās jaunākos krājumu līmeņus bez liekas servera slodzes. Šī pieeja nodrošina mērogojamību, vienlaikus saglabājot nevainojamu lietotāja pieredzi. 🛒
Iekļaujot uzlabotas rindas sistēmas, piemēram, BullMQ, kā mēs to darījām ar piešķīruma kupons rinda, palielina lielapjoma datu apstrādes uzdevumu noturību. Rinda nodrošina, ka pat tad, ja notiek servera restartēšana, neapstiprinātie uzdevumi paliek neskarti un apstrāde tiek atsākta. Turklāt var konfigurēt atkārtotas mēģinājuma mehānismus, nodrošinot, ka neveiksmīgie darbi (piemēram, pagaidu datu bāzes dīkstāves dēļ) tiek mēģināti atkārtoti automātiski. Piemēram, ja, sadalot 300 darbiniekus dažādās nodaļās, rodas īslaicīga kļūda, rindas noturība nodrošina, ka neviens ieraksts netiek atstāts neapstrādāts, tādējādi palielinot jūsu sistēmas uzticamību.
Papildus reāllaika paziņojumiem SSE var arī papildināt e-pasta pakalpojumus uzdevumiem, kuriem nepieciešami detalizēti kopsavilkumi. Kad visi kuponu paziņojumi ir nosūtīti, izmantojot SSE, aizmugursistēma var asinhroni ģenerēt pārskatu un nosūtīt konsolidētu e-pasta ziņojumu vadītājiem. Šī daudzkanālu komunikācija nodrošina gan tūlītējus paziņojumus, gan visaptverošus pēcpārbaudes, apmierinot plašu lietotāju vēlmju klāstu. Šāda integrācija uzlabo jūsu sistēmas elastību, radot visaptverošu lietotāja pieredzi. 📧
Bieži uzdotie jautājumi par SSE pakalpojumā NestJS
- Kādas ir servera puses notikumu izmantošanas priekšrocības salīdzinājumā ar WebSockets?
- SSE ir vienkāršāk ieviest un izmanto HTTP, padarot to draudzīgu ugunsmūrim. Atšķirībā no WebSockets, tam ir nepieciešams tikai viens vienvirziena savienojums, kas ir efektīvs reāllaika atjauninājumiem.
- Vai es varu izmantot @Sse ar vairākiem galapunktiem kontrolierī?
- Jā, jūs varat definēt vairākus @Sse galapunkti vienā un tajā pašā kontrolierī, lai apkalpotu klientiem dažādas datu plūsmas, pamatojoties uz īpašām vajadzībām.
- Kā rīkoties ar kļūdām rindas apstrādes laikā?
- Izmantojot BullMQ, varat definēt atkārtošanas opcijas un izmantot tādus notikumu klausītājus kā @OnWorkerEvent('failed') lai reģistrētu kļūdas un vajadzības gadījumā atkārtoti apstrādātu darbus.
- Vai Prismā createMany metode atbalsta darījumu atcelšanu?
- Jā, Prismā createMany var ietīt darījumā. Ja kāda darījuma operācija neizdodas, visas darbības tiek atceltas, lai nodrošinātu konsekvenci.
- Kas notiek, ja klients atvienojas SSE straumes laikā?
- Serveris pārtrauc sūtīt atjauninājumus, tiklīdz tas konstatē atvienošanos. Jūs varat ieviest atkārtotas savienojuma loģiku klientam, izmantojot EventSource API.
- Vai SSE var izmantot divvirzienu saziņai?
- Nē, SSE ir vienvirziena (no servera uz klientu). Divvirzienu saziņai izmantojiet WebSockets vai HTTP2 straumes.
- Kā nodrošināt SSE galapunktus NestJS?
- Izmantojiet aizsargus vai starpprogrammatūru, piemēram @UseGuards, lai ieviestu jūsu SSE galapunktu autentifikāciju un autorizāciju.
- Vai SSE var strādāt ar klientiem, kas nav pārlūkprogrammas?
- Jā, jebkurš klients, kas atbalsta HTTP un notikumu straumēšanu (piemēram, Node.js, cURL), var izmantot SSE straumes.
- Kāds ir maksimālais klientu skaits, kas var izveidot savienojumu ar SSE galapunktu?
- Tas ir atkarīgs no jūsu servera konfigurācijas un resursu ierobežojumiem. Slodzes līdzsvarošana un klasterizācija var palīdzēt mērogot, lai atbalstītu vairāk klientu.
- Vai ir iespējams nosūtīt JSON datus, izmantojot SSE?
- Jā, jūs varat serializēt objektus uz JSON virknēm un nosūtīt tos, izmantojot new MessageEvent pakalpojumā NestJS.
Efektīvi reāllaika paziņojumi pakalpojumā NestJS
Reāllaika sistēmu ieviešana, izmantojot SSE NestJS vienkāršo saziņu starp serveri un klientiem. Šī metode samazina servera slodzi salīdzinājumā ar pastāvīgu aptauju un nodrošina precīzu paziņojumu mērķauditorijas atlasi. Piemēram, HR rīks var informēt 200 pārdošanas darbiniekus par jauniem kuponiem, netraucējot citiem. 🎯
Izmantojot tādus rīkus kā BullMQ un Prisma, šī iestatīšana nodrošina asinhronu uzdevumu apstrādi un efektīvas datu bāzes darbības. Uz notikumiem balstītas arhitektūras elastība padara to par mērogojamu risinājumu dažādām reāllaika prasībām, uzlabojot lietotāju iesaisti un sistēmas uzticamību.
Avoti un atsauces
- Detalizēta dokumentācija par NestJS Framework mērogojamu servera puses lietojumprogrammu izveidei.
- Lietošanas pamācība BullMQ stabilai darbu rindu pārvaldībai lietojumprogrammās Node.js.
- Oficiālā Prisma dokumentācija datu bāzes operācijām un ORM lietošanai.
- Ieskats par Servera nosūtītie notikumi (SSE) reāllaika saziņai klients-serveris.
- Praktiski frontend ieviešanas piemēri no ReactJS dokumentācija interaktīvu lietotāja saskarņu izveidei.