Supaprastintas pranešimų pristatymas atliekant masinio įterpimo operacijas
Įsivaizduokite, kad valdote sistemą, kurioje šimtams darbuotojų yra priskiriami kvitai pagal įvairius kriterijus, pvz., skyrių, lygį ar patirtį. Tai milžiniška užduotis efektyviai informuoti kiekvieną darbuotoją, nesudarant sistemos kliūčių. 🔔 Šis iššūkis tampa dar bauginantis, kai siekiate išvengti lizdų ar apklausos mechanizmų sudėtingumo.
Tokiais atvejais serverio įvykiai (SSE) pasirodo kaip galingas, bet paprastas sprendimas. Naudodami SSE savo NestJS programoje galite sukurti realiojo laiko ryšio kanalą, kad praneštumėte konkrečioms darbuotojų grupėms pagal dinaminius kriterijus. Pavyzdžiui, pardavimų skyriui paskirstant kuponus, pranešimus turėtų gauti tik tie darbuotojai, užtikrinantys tikslius ir prasmingus atnaujinimus.
Šiame straipsnyje pažvelgsime į praktinį pavyzdį, rodantį, kaip integruoti SSE į masinio įterpimo procesą naudojant NestJS. Peržiūrėsime visą gyvavimo ciklą – nuo įvykių suaktyvinimo vidinėje programoje iki naujienų klausymosi priekinėje sistemoje, išlaikant sklandų veikimą. 💼
Nesvarbu, ar kuriate žmogiškųjų išteklių įrankį, ar finansų programą, supratę šią darbo eigą galėsite teikti suasmenintus pranešimus realiuoju laiku. Išsiaiškinkime SSE paprastumą ir tai, kaip ji gali pagerinti jūsų programos naudotojo patirtį.
komandą | Naudojimo pavyzdys |
---|---|
@Sse | „NestJS“ dekoratorius, naudojamas serverio pusės įvykių (SSE) galutiniam taškui apibrėžti. Pavyzdžiui, @Sse("vauchered-darbuotojas") nustato galutinį tašką, kad klientui būtų perduodami naujiniai realiuoju laiku. |
fromEvent | Funkcija iš RxJS, konvertuojanti įvykį, kurį skleidžia an EventEmitter į pastebimą srautą.
Pavyzdžiui, fromEvent(this.eventEmitter, "po pridėtojo-kvitą") klausosi konkretaus įvykio. |
Observable | Pagrindinė RxJS koncepcija, naudojama asinchroniniams duomenų srautams valdyti.
Tai būtina norint tvarkyti serverio įvykius „NestJS“, pvz Pastebima<MessageEvent> . |
@InjectQueue | „NestJS“ dekoratorius, įterpiantis eilės egzempliorių, naudingas tvarkant užduočių apdorojimą su bibliotekomis, tokiomis kaip „Bull“.
Pavyzdžiui, @InjectQueue('allotVoucher') suteikia prieigą prie eilės pavadinimu „allotVoucher“. |
WorkerHost | Pagrindinė „BullMQ“ klasė, leidžianti apibrėžti pasirinktinius užduočių procesorius „NestJS“.
Pavyzdžiui, „AllotVoucherConsumer“. klasė pratęsiama WorkerHost atlikti konkrečius darbus. |
@OnWorkerEvent | Dekoratorius klausydavo konkrečių eilės darbo gyvavimo ciklo įvykių.
Pavyzdžiui, @OnWorkerEvent('baigta') tvarko „užbaigtą“ darbo įvykį. |
createMany | Prisma komanda, naudojama įterpti kelis įrašus į duomenų bazę vienu metu.
Pavyzdžiui, prisma.employeeVoucher.createMany prideda visų darbuotojų kuponus viena operacija. |
EventSource | „JavaScript“ API, skirta gauti serverio siunčiamus įvykius (SSE) iš užpakalinės programos.
Pavyzdžiui, naujas įvykio šaltinis ('http://localhost/vouchered-employee') užmezga ryšį duomenims perduoti. |
add | Metodas iš Bull eilių, kaip pridėti naują užduotį į eilę.
Pavyzdžiui, allotVoucherQueue.add('allot-voucher', jobData) suplanuoja darbą apdorojimui. |
@OnEvent | „NestJS“ dekoratorius, klausantis konkrečių programos skleidžiamų įvykių.
Pavyzdžiui, @OnEvent('po paskirstymo kvito') suaktyvina metodą, kai išleidžiamas šis įvykis. |
Veiksmingi pranešimai su serverio įvykiais ir eilėmis
Pateikti scenarijai iliustruoja sistemą, kurioje darbuotojams realiu laiku siunčiami pranešimai po masinio kupono įrašų įterpimo į duomenų bazę. Procesas prasideda Paskirstykite VoucherController, kuris atskleidžia galutinį tašką, skirtą kuponų paskirstymo užduotims kurti. Kai sukuriama užduotis, ji skleidžia įvykį pavadinimu po paskirstymo-čekio. Šis įvykis yra būtinas norint pradėti tolesnius veiksmus, užtikrinant, kad sistema būtų pagrįsta įvykiais ir būtų modulinė. Ši konstrukcija leidžia aiškiai atskirti problemas, todėl sistema tampa lengviau prižiūrima ir keičiama. 🎯
Paslaugų lygmenyje Paskirstykite kvito paslaugą tvarko užduočių eilės logiką naudojant BullMQ. Gavęs po paskirstymo-čekio įvykį, jis prideda užduotį į eilę pavadinimu paskirstymo talonas. Ši eilė leidžia apdoroti asinchroniškai, užtikrinant, kad sistema reaguotų net apdorojant didelius duomenų rinkinius. Pavyzdžiui, jei paskirstote kvitus 200 darbuotojų Pardavimų skyriuje, eilė užtikrina, kad operacija neblokuotų kitų užklausų. Eilės konfigūracija apima tokias parinktis kaip RemoveOnComplete kad baigus darbą Redis būtų švarus.
Eilės užduotis apdoroja „AllotVoucherConsumer“. klasė. Čia įgyvendinama atitinkamų darbuotojų identifikavimo ir kvito įrašų įvedimo į duomenų bazę logika. Komanda Prisma sukurti Daug naudojamas įrašams paketiniu būdu įterpti į darbuotojo kuponas lentelė, kuri yra optimizuota našumui. Pasibaigus duomenų bazės operacijai, išsiunčiamas kitas įvykis, informuojantis abonentus. Šis įvykis užtikrina, kad darbuotojai būtų informuojami tik sėkmingai atlikus masinį įterpimą, o tai padidina pranešimų sistemos patikimumą. 🌟
Frontend komponentas React klausosi serverio siunčiamų įvykių per an Įvykio šaltinis. Darbuotojams pranešus, jų informacija dinamiškai atnaujinama vartotojo sąsajoje neatnaujinant puslapio. Šis metodas suteikia sklandžią vartotojo patirtį, panašią į realiojo laiko atnaujinimus, matomus šiuolaikinėse žiniatinklio programose, pvz., tiesioginiuose sporto rezultatuose ar socialinės žiniasklaidos pranešimuose. Pavyzdžiui, personalo skyriaus darbuotojai nematys naujinimų, skirtų pardavimui, nes užpakalinė programa tiksliai filtruoja įvykius pagal paskirstymo kriterijus. Šis specifiškumas padidina našumą ir aktualumą, sukuriant į vartotoją orientuotą sistemą. 🖥️
Masinis pranešimų siuntimas naudojant serverio įvykius (SSE) „NestJS“.
Šis sprendimas demonstruoja „NestJS“ su „Prisma“ ir serverio pusės įvykiais (SSE) naudojimą masinėms operacijoms. Ji apima įvykiais pagrįstą architektūrą ir eilių sistemą.
// 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 })),
);
}
}
Masinių įdėklų, naudojant NestJS ir React, naujinimai realiuoju laiku
Šiame sąsajos pavyzdyje naudojama React, kad būtų galima klausytis serverio įvykių ir dinamiškai atnaujinti vartotojo sąsają, kai gaunami duomenys. Tai užtikrina, kad darbuotojai būtų informuoti realiuoju laiku po masinio įterpimo.
// 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;
Įrenginio testavimo pranešimai masinio įterpimo operacijoms
Šis „Jest“ testas užtikrina, kad įvykių perdavimo ir pranešimų mechanizmas tinkamai veiktų serverio įvykių foninėje sistemoje „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);
});
});
Realiojo laiko sistemų tobulinimas naudojant SSE sistemoje „NestJS“.
Nors mes ištyrėme serverio įvykių (SSE), skirtų darbuotojams pranešti apie kvitų paskirstymą, diegimą, yra platesnis SSE naudojimo realaus laiko sistemose atvejis. SSE puikiai tinka scenarijuose, kai klientai turi nuolat atnaujinti serverio duomenis be nuolatinės apklausos. Pavyzdžiui, pagalvokite apie internetinę mažmeninės prekybos platformą, stebinčią tiesioginius atsargų atnaujinimus per greitą išpardavimą. Naudodami SSE galite efektyviai siųsti naujinimus visiems prijungtiems klientams, užtikrindami, kad jie peržiūrėtų naujausius atsargų lygius be nereikalingos serverio apkrovos. Šis metodas užtikrina mastelio keitimą, kartu išlaikant sklandžią vartotojo patirtį. 🛒
Įtraukiant pažangias eilių sistemas, tokias kaip BullMQ, kaip tai padarėme su paskirstymo talonas eilę, padidina masinio duomenų apdorojimo užduočių tvirtumą. Eilė užtikrina, kad net ir įvykus serverio paleidimui iš naujo, laukiančios užduotys liktų nepažeistos, o apdorojimas bus atnaujintas. Be to, galima konfigūruoti pakartotinio bandymo mechanizmus, užtikrinančius, kad nepavykusios užduotys (pvz., dėl laikino duomenų bazės prastovos) būtų bandomos automatiškai. Pavyzdžiui, jei paskirstant 300 darbuotojų visuose skyriuose įvyksta laikina klaida, eilės atsparumas užtikrina, kad neliktų neapdorotų įrašų, o tai padidina jūsų sistemos patikimumą.
Be pranešimų realiuoju laiku, SSE taip pat gali papildyti el. pašto paslaugas atliekant užduotis, kurioms reikia išsamių suvestinių. Kai visi pranešimai apie kvitą bus išsiųsti per SSE, užpakalinė programa gali asinchroniškai generuoti ataskaitą ir išsiųsti konsoliduotą el. laišką vadovams. Šis kelių kanalų ryšys užtikrina tiek greitus pranešimus, tiek visapusiškus tolesnius veiksmus, atitinkančius daugybę vartotojų pageidavimų. Tokia integracija padidina jūsų sistemos lankstumą ir sukuria visapusišką vartotojo patirtį. 📧
Dažnai užduodami klausimai apie SSE sistemoje NestJS
- Kokie yra serverio įvykių naudojimo pranašumai, palyginti su „WebSockets“?
- SSE yra paprasčiau įdiegti ir naudojamas HTTP, todėl jis tinkamas ugniasienei. Skirtingai nei „WebSockets“, jai reikalingas tik vienas vienakryptis ryšys, kuris yra efektyvus naujinimams realiuoju laiku.
- Ar galiu naudoti @Sse su keliais galiniais taškais valdiklyje?
- Taip, galite apibrėžti kelis @Sse galutiniai taškai tame pačiame valdiklyje, kad aptarnautų skirtingus duomenų srautus klientams pagal konkrečius poreikius.
- Kaip tvarkyti klaidas eilės apdorojimo metu?
- Naudodami „BullMQ“ galite nustatyti pakartotinio bandymo parinktis ir naudoti įvykių klausytojus @OnWorkerEvent('failed') registruoti klaidas ir, jei reikia, iš naujo apdoroti užduotis.
- Ar Prisma createMany metodo palaikymo operacijų grąžinimas?
- Taip, Prisma createMany gali būti įtrauktas į sandorį. Jei kuri nors operacijos operacija nepavyksta, visos operacijos atšaukiamos siekiant nuoseklumo.
- Kas atsitiks, jei klientas atsijungs SSE srauto metu?
- Serveris nustoja siųsti naujinimus, kai nustato atsijungimą. Galite įdiegti pakartotinio prisijungimo logiką kliente naudodami EventSource API.
- Ar SSE galima naudoti abipusiam ryšiui palaikyti?
- Ne, SSE yra vienakryptė (serveris–klientas). Dvikrypčiai komunikacijai naudokite WebSockets arba HTTP2 srautus.
- Kaip apsaugoti SSE galinius taškus „NestJS“?
- Naudokite apsaugas ar tarpines programas, pvz @UseGuards, kad būtų užtikrintas jūsų SSE galinių taškų autentifikavimas ir prieigos teisė.
- Ar SSE gali dirbti su ne naršyklės klientais?
- Taip, bet kuris klientas, palaikantis HTTP ir įvykių srautinį perdavimą (pvz., Node.js, cURL), gali naudoti SSE srautus.
- Koks yra didžiausias klientų, galinčių prisijungti prie SSE galutinio taško, skaičius?
- Tai priklauso nuo jūsų serverio konfigūracijos ir išteklių apribojimų. Apkrovos balansavimas ir grupavimas gali padėti padidinti mastelį ir palaikyti daugiau klientų.
- Ar galima siųsti JSON duomenis per SSE?
- Taip, galite suskirstyti objektus į JSON eilutes ir siųsti juos naudodami new MessageEvent „NestJS“.
Veiksmingi pranešimai realiuoju laiku sistemoje „NestJS“.
Realaus laiko sistemų diegimas naudojant SSE NestJS supaprastina ryšį tarp serverio ir klientų. Šis metodas sumažina serverio apkrovą, palyginti su nuolatine apklausa, ir leidžia tiksliai nukreipti pranešimus. Pavyzdžiui, žmogiškųjų išteklių įrankis gali pranešti 200 pardavimo darbuotojų apie naujus kuponus, netrukdydamas kitiems. 🎯
Naudojant tokius įrankius kaip BullMQ ir Prisma, ši sąranka užtikrina asinchroninį užduočių apdorojimą ir efektyvias duomenų bazės operacijas. Dėl įvykiais pagrįstos architektūros lankstumo tai yra keičiamo dydžio sprendimas įvairiems realaus laiko reikalavimams, padidinantis vartotojų įsitraukimą ir sistemos patikimumą.
Šaltiniai ir nuorodos
- Išsamią dokumentaciją apie „NestJS Framework“. serverio pusės programoms kurti.
- Naudojimo vadovas BullMQ patikimam užduočių eilių valdymui Node.js programose.
- Oficialus Prisma dokumentacija duomenų bazės operacijoms ir ORM naudojimui.
- Įžvalgos apie Serverio išsiųsti įvykiai (SSE) Kliento ir serverio bendravimui realiuoju laiku.
- Praktiniai frontend įgyvendinimo pavyzdžiai iš „ReactJS“ dokumentacija interaktyvioms vartotojo sąsajoms kurti.