Poenostavljena dostava obvestil za operacije množičnega vstavljanja
Predstavljajte si, da upravljate sistem, kjer na stotine zaposlenih prejema bone na podlagi različnih meril, kot so oddelek, ocena ali izkušnje. Učinkovito obveščati vsakega zaposlenega brez povzročanja ozkih grl v sistemu je ogromna naloga. 🔔 Ta izziv postane še bolj zastrašujoč, ko se želite izogniti zapletenosti vtičnic ali mehanizmov glasovanja.
V takšnih scenarijih se dogodki na strani strežnika (SSE) pokažejo kot močna, a enostavna rešitev. Z uporabo SSE v vaši aplikaciji NestJS lahko vzpostavite komunikacijski kanal v realnem času za obveščanje določenih skupin zaposlenih na podlagi dinamičnih meril. Na primer, ko so vavčerji dodeljeni oddelku prodaje, morajo le ti zaposleni prejeti obvestila, kar zagotavlja natančne in smiselne posodobitve.
V tem članku se bomo poglobili v praktični primer, ki prikazuje, kako integrirati SSE v postopek množičnega vstavljanja z uporabo NestJS. Sprehodili se bomo skozi življenjski cikel, od sprožanja dogodkov v zaledju do poslušanja posodobitev na sprednjem delu, pri čemer bomo ohranili brezhibno delovanje. 💼
Ne glede na to, ali razvijate kadrovsko orodje ali finančno aplikacijo, vam bo razumevanje tega poteka dela omogočilo pošiljanje prilagojenih obvestil v realnem času. Razkrijmo preprostost SSE in kako lahko izboljša uporabniško izkušnjo vaše aplikacije.
Ukaz | Primer uporabe |
---|---|
@Sse | Dekorater NestJS, ki se uporablja za definiranje končne točke dogodkov na strani strežnika (SSE). na primer @Sse('zaposleni z boni') nastavi končno točko za pretakanje posodobitev v realnem času odjemalcu. |
fromEvent | Funkcija iz RxJS, ki pretvori dogodek, ki ga odda EventEmitter v opazen tok.
na primer fromEvent(this.eventEmitter, 'after-added-voucher') posluša določen dogodek. |
Observable | Osnovni koncept iz RxJS, ki se uporablja za upravljanje asinhronih podatkovnih tokov.
Bistvenega pomena je za obravnavanje dogodkov na strani strežnika v NestJS, npr Opazljivo<MessageEvent> . |
@InjectQueue | Dekorater NestJS, ki vstavi primerek čakalne vrste, uporaben za upravljanje obdelave opravil s knjižnicami, kot je Bull.
na primer @InjectQueue('allotVoucher') omogoča dostop do čakalne vrste z imenom 'allotVoucher'. |
WorkerHost | Osnovni razred iz BullMQ, ki omogoča definiranje procesorjev opravil po meri v NestJS.
Na primer, AllotVoucherConsumer razred se razširi WorkerHost za opravljanje določenih del. |
@OnWorkerEvent | Dekorater, ki je poslušal določene dogodke življenjskega cikla opravila čakalne vrste.
Na primer, @OnWorkerEvent('dokončano') obravnava "zaključen" dogodek opravila. |
createMany | Ukaz Prisma, ki se uporablja za vstavljanje več zapisov v bazo podatkov hkrati.
na primer prisma.employee Voucher.createMany doda bone vseh zaposlenih v eni sami operaciji. |
EventSource | JavaScript API za prejemanje dogodkov, poslanih s strežnika (SSE) iz ozadja.
na primer nov EventSource('http://localhost/vouchered-employee') vzpostavi povezavo za pretakanje podatkov. |
add | Metoda iz čakalnih vrst Bull za dodajanje novega opravila v čakalno vrsto.
Na primer, allotVoucherQueue.add('allot-voucher', jobData) načrtuje opravilo za obdelavo. |
@OnEvent | Dekorater NestJS, ki posluša določene dogodke, oddane znotraj aplikacije.
na primer @OnEvent('after-allocate-voucher') sproži metodo, ko je oddan ta dogodek. |
Učinkovita obvestila z dogodki in čakalnimi vrstami na strani strežnika
Predloženi skripti ponazarjajo sistem, kjer se zaposlenim pošiljajo obvestila v realnem času po množičnem vnosu zapisov bonov v bazo podatkov. Proces se začne v AllocateVoucherController, ki razkriva končno točko za ustvarjanje nalog dodeljevanja kuponov. Ko je naloga ustvarjena, sproži dogodek z imenom bon po dodelitvi. Ta dogodek je bistvenega pomena za sprožitev naslednjih korakov, kar zagotavlja, da je sistem voden po dogodkih in modularen. Ta zasnova omogoča jasno ločevanje skrbi, zaradi česar je sistem bolj vzdržljiv in prilagodljiv. 🎯
V storitvenem sloju je AllocateVoucherService obravnava logiko za čakalno vrsto opravil z uporabo BullMQ. Po prejemu bon po dodelitvi dogodek, doda opravilo v čakalno vrsto z imenom dodelitveni bon. Ta čakalna vrsta omogoča asinhrono obdelavo, kar zagotavlja, da sistem ostane odziven tudi pri obdelavi velikih naborov podatkov. Na primer, če dodelite bone 200 zaposlenim v oddelku prodaje, čakalna vrsta zagotavlja, da operacija ne blokira drugih zahtev. Konfiguracija čakalne vrste vključuje možnosti, kot so removeOnComplete da ostane Redis čist po zaključku dela.
Opravila v čakalni vrsti obdeluje AllotVoucherConsumer razred. Tu je implementirana logika za identifikacijo ustreznih zaposlenih in vstavljanje zapisov bonov v bazo podatkov. Ukaz Prisma createMany se uporablja za paketno vstavljanje zapisov v zaposlenegaVoucher tabela, ki je optimizirana za delovanje. Ko je operacija baze podatkov končana, se sproži še en dogodek, ki obvesti naročnike. Ta dogodek zagotavlja, da so zaposleni obveščeni šele po uspešni obdelavi množičnega vstavljanja, kar poveča zanesljivost sistema obveščanja. 🌟
Na sprednjem delu komponenta React posluša dogodke, poslane s strežnika, prek EventSource. Ko so zaposleni obveščeni, se njihovi podatki dinamično posodabljajo v uporabniškem vmesniku, ne da bi bilo treba osvežiti stran. Ta pristop zagotavlja brezhibno uporabniško izkušnjo, podobno posodobitvam v realnem času, ki jih vidimo v sodobnih spletnih aplikacijah, kot so športni rezultati v živo ali obvestila družbenih medijev. Na primer, zaposleni v kadrovski službi ne bodo videli posodobitev, namenjenih prodaji, saj zaledje natančno filtrira dogodke na podlagi kriterijev dodelitve. Ta specifičnost povečuje tako zmogljivost kot ustreznost ter ustvarja sistem, osredotočen na uporabnika. 🖥️
Množično pošiljanje obvestil s strežniškimi dogodki (SSE) v NestJS
Ta rešitev prikazuje zaledni pristop k uporabi NestJS s Prismo in dogodki na strani strežnika (SSE) za množične operacije. Vključuje arhitekturo, ki temelji na dogodkih, in sistem čakalnih vrst.
// 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 })),
);
}
}
Posodobitve v realnem času za množične vstavke z uporabo NestJS in React
Ta primer sprednjega dela uporablja React za poslušanje dogodkov na strani strežnika in dinamično posodabljanje uporabniškega vmesnika, ko so podatki prejeti. Zagotavlja, da so zaposleni obveščeni v realnem času po množičnem vstavljanju.
// 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;
Obvestila o testiranju enote za operacije množičnega vstavljanja
Ta preizkus Jest zagotavlja, da oddajanje dogodkov in mehanizem obveščanja pravilno delujeta v ozadju za dogodke na strani strežnika v 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);
});
});
Izboljšanje sistemov v realnem času s SSE v NestJS
Medtem ko smo raziskali implementacijo dogodkov na strani strežnika (SSE) za obveščanje zaposlenih o dodelitvi bonov, obstaja širši primer uporabe SSE v sistemih v realnem času. SSE blesti v scenarijih, kjer morajo odjemalci biti posodobljeni s podatki strežnika brez nenehnega preverjanja. Na primer, razmislite o spletni maloprodajni platformi, ki spremlja posodobitve inventarja v živo med hitro prodajo. S SSE lahko učinkovito pošljete posodobitve vsem povezanim odjemalcem in zagotovite, da si ogledajo najnovejše ravni zalog brez nepotrebne obremenitve strežnika. Ta pristop zagotavlja razširljivost, hkrati pa ohranja brezhibno uporabniško izkušnjo. 🛒
Vključitev naprednih čakalnih sistemov, kot je BullMQ, kot smo storili z dodelitveni bon čakalno vrsto, dodaja robustnost nalogam množične obdelave podatkov. Čakalna vrsta zagotavlja, da čakajoče naloge ostanejo nedotaknjene, tudi če se strežnik znova zažene, obdelava pa se nadaljuje. Poleg tega je mogoče konfigurirati mehanizme ponovnega poskusa, ki zagotavljajo, da se neuspela opravila (npr. zaradi začasne zaustavitve baze podatkov) samodejno znova poskusijo. Na primer, če pri dodelitvi 300 zaposlenim v različnih oddelkih pride do začasne napake, odpornost čakalne vrste zagotovi, da noben zapis ne ostane neobdelan, kar poveča zanesljivost vašega sistema.
Poleg obvestil v realnem času lahko SSE dopolni tudi e-poštne storitve za naloge, ki zahtevajo podrobne povzetke. Ko so vsa obvestila o kuponih poslana prek SSE, lahko zaledje asinhrono ustvari poročilo in upraviteljem pošlje konsolidirano e-pošto. Ta večkanalna komunikacija zagotavlja tako takojšnja obvestila kot obsežna spremljanja, ki ustrezajo širokemu naboru uporabniških preferenc. Takšna integracija poveča prilagodljivost vašega sistema in ustvari dobro zaokroženo uporabniško izkušnjo. 📧
Pogosta vprašanja o SSE v NestJS
- Kakšne so prednosti uporabe dogodkov na strani strežnika prek spletnih vtičnic?
- SSE je preprostejši za implementacijo in uporablja HTTP, zaradi česar je prijazen do požarnega zidu. Za razliko od WebSockets zahteva samo eno enosmerno povezavo, ki je učinkovita za posodobitve v realnem času.
- Ali lahko uporabim @Sse z več končnimi točkami v krmilniku?
- Da, lahko določite več @Sse končne točke v istem krmilniku za streženje različnih podatkovnih tokov strankam glede na specifične potrebe.
- Kako obravnavam napake med obdelavo čakalne vrste?
- Z BullMQ lahko definirate možnosti ponovnega poskusa in uporabite poslušalce dogodkov, kot je @OnWorkerEvent('failed') za beleženje napak in po potrebi ponovno obdelavo opravil.
- Ali Prisma createMany metoda podpira povratne transakcije?
- Ja, Prisma createMany se lahko zavije v transakcijo. Če katera koli operacija v transakciji ne uspe, se zaradi doslednosti vse operacije povrnejo nazaj.
- Kaj se zgodi, če odjemalec prekine povezavo med tokom SSE?
- Strežnik preneha pošiljati posodobitve, ko zazna prekinitev povezave. Na odjemalcu lahko implementirate logiko ponovne povezave z uporabo EventSource API.
- Ali se SSE lahko uporablja za dvosmerno komunikacijo?
- Ne, SSE je enosmeren (od strežnika do odjemalca). Za dvosmerno komunikacijo uporabite tokove WebSockets ali HTTP2.
- Kako zavarujem končne točke SSE v NestJS?
- Uporabite varovala ali vmesno opremo, npr @UseGuards, za uveljavitev avtentikacije in avtorizacije za vaše končne točke SSE.
- Ali lahko SSE deluje z odjemalci brez brskalnika?
- Da, vsak odjemalec, ki podpira HTTP in pretakanje dogodkov (npr. Node.js, cURL), lahko uporablja tokove SSE.
- Kakšno je največje število odjemalcev, ki se lahko povežejo s končno točko SSE?
- To je odvisno od konfiguracije vašega strežnika in omejitev virov. Izravnavanje obremenitve in združevanje v gruče lahko pomagata povečati obseg za podporo več odjemalcem.
- Ali je mogoče poslati podatke JSON prek SSE?
- Da, predmete lahko serializirate v nize JSON in jih pošljete z uporabo new MessageEvent v NestJS.
Učinkovita obvestila v realnem času v NestJS
Izvajanje sistemov v realnem času z uporabo SSE v NestJS poenostavlja komunikacijo med strežnikom in odjemalci. Ta metoda zmanjša obremenitev strežnika v primerjavi s stalnim anketiranjem in omogoča natančno ciljanje za obvestila. Na primer, kadrovsko orodje lahko obvesti 200 zaposlenih v prodaji o novih vavčerjih, ne da bi motilo druge. 🎯
Z orodji, kot sta BullMQ in Prisma, ta nastavitev zagotavlja asinhrono obdelavo opravil in učinkovite operacije baze podatkov. Prilagodljivost arhitekture, ki temelji na dogodkih, jo naredi razširljivo rešitev za različne zahteve v realnem času, kar izboljšuje sodelovanje uporabnikov in zanesljivost sistema.
Viri in reference
- Podrobna dokumentacija o Ogrodje NestJS za izdelavo razširljivih aplikacij na strani strežnika.
- Navodila za uporabo BullMQ za robustno upravljanje čakalne vrste opravil v aplikacijah Node.js.
- Uradno Dokumentacija Prisma za operacije baze podatkov in uporabo ORM.
- Vpogledi na Dogodki, poslani iz strežnika (SSE) za komunikacijo med odjemalcem in strežnikom v realnem času.
- Primeri praktične implementacije vmesnika iz Dokumentacija ReactJS za izgradnjo interaktivnih uporabniških vmesnikov.