Strömlinjeformad aviseringsleverans för bulkinsertoperationer
Föreställ dig att du hanterar ett system där hundratals anställda tilldelas kuponger baserat på olika kriterier som avdelning, betyg eller erfarenhet. Det är en kolossal uppgift att meddela varje anställd effektivt utan att orsaka flaskhalsar i systemet. 🔔 Den här utmaningen blir ännu mer skrämmande när du siktar på att undvika komplexiteten med uttag eller pollningsmekanismer.
I sådana scenarier framstår Server-Side Events (SSE) som en kraftfull men enkel lösning. Genom att utnyttja SSE i din NestJS-applikation kan du skapa en kommunikationskanal i realtid för att meddela specifika grupper av anställda baserat på dynamiska kriterier. Till exempel, när kuponger allokeras till försäljningsavdelningen, bör endast de anställda få meddelanden, vilket säkerställer exakta och meningsfulla uppdateringar.
Genom den här artikeln kommer vi att dyka ner i ett praktiskt exempel som visar hur man integrerar SSE i en massinsättningsprocess med NestJS. Vi går igenom livscykeln, från att trigga händelser i backend till att lyssna efter uppdateringar på frontend, allt samtidigt som vi behåller sömlös prestanda. 💼
Oavsett om du utvecklar ett HR-verktyg eller en finansapp, kommer att förstå detta arbetsflöde att ge dig möjlighet att leverera personliga aviseringar i realtid. Låt oss reda ut enkelheten hos SSE och hur den kan höja din applikations användarupplevelse.
Kommando | Exempel på användning |
---|---|
@Sse | En NestJS-dekoratör som används för att definiera en slutpunkt för Server-Side Events (SSE). Till exempel, @Sse('kuponganställd') ställer in en slutpunkt för att strömma realtidsuppdateringar till klienten. |
fromEvent | En funktion från RxJS som konverterar en händelse som sänds ut av en EventEmitter in i en observerbar ström.
Till exempel, fromEvent(this.eventEmitter, 'after-added-voucher') lyssnar efter en specifik händelse. |
Observable | Ett kärnkoncept från RxJS som används för att hantera asynkrona dataströmmar.
Det är viktigt för att hantera Server-Side Events i NestJS, som Märkbar<MessageEvent> . |
@InjectQueue | En NestJS-dekoratör som injicerar en köinstans, användbar för att hantera jobbbearbetning med bibliotek som Bull.
Till exempel, @InjectQueue('allotVoucher') ger tillgång till kön som heter 'allotVoucher'. |
WorkerHost | En basklass från BullMQ som gör det möjligt att definiera anpassade jobbprocessorer i NestJS.
Till exempel AllotVoucherConsumer klass sträcker sig WorkerHost att hantera specifika jobb. |
@OnWorkerEvent | En dekoratör brukade lyssna på specifika livscykelhändelser för ett köjobb.
Till exempel, @OnWorkerEvent('avslutad') hanterar den "avslutade" händelsen av ett jobb. |
createMany | Ett Prisma-kommando som används för att infoga flera poster i en databas samtidigt.
Till exempel, prisma.anställdVoucher.skapaMånga lägger till alla anställdas vouchers i en enda operation. |
EventSource | Ett JavaScript API för att ta emot serversända händelser (SSE) från backend.
Till exempel, new EventSource('http://localhost/vouchered-employee') upprättar en anslutning för strömmande data. |
add | En metod från Bull-köer för att lägga till ett nytt jobb i kön.
Till exempel, allotVoucherQueue.add('allot-voucher', jobData) schemalägger ett jobb för bearbetning. |
@OnEvent | En NestJS-dekoratör som lyssnar efter specifika händelser som sänds ut i applikationen.
Till exempel, @OnEvent('after-allocate-voucher') utlöser en metod när denna händelse sänds ut. |
Effektiva meddelanden med händelser och köer på serversidan
De skript som tillhandahålls illustrerar ett system där realtidsmeddelanden skickas till anställda efter massinförande av verifikationsposter i databasen. Processen börjar i AllocateVoucherController, som visar en slutpunkt för att skapa verifikationstilldelningsuppgifter. När en uppgift skapas avger den en händelse med namnet efter-tilldela-voucher. Denna händelse är väsentlig för att trigga de efterföljande stegen, för att säkerställa att systemet är händelsestyrt och modulärt. Denna design möjliggör en tydlig separation av problem, vilket gör systemet mer underhållbart och skalbart. 🎯
I tjänsteskiktet är AllocateVoucherService hanterar logiken för att köa uppgifter med BullMQ. Efter att ha mottagit efter-tilldela-voucher händelse, lägger den till ett jobb i den namngivna kön allot-voucher. Denna kö tillåter asynkron bearbetning, vilket säkerställer att systemet förblir responsivt även vid bearbetning av stora datamängder. Om du till exempel allokerar kuponger till 200 anställda på försäljningsavdelningen, säkerställer kön att operationen inte blockerar andra förfrågningar. Köns konfiguration inkluderar alternativ som removeOnComplete för att hålla Redis ren efter avslutat jobb.
Köjobben behandlas av AllotVoucherConsumer klass. Här implementeras logiken för att identifiera relevanta anställda och infoga verifikationsposter i databasen. Prismakommandot skapa många används för att batch-infoga poster i anställd voucher tabell, som är optimerad för prestanda. Efter att databasoperationen är klar sänds en annan händelse ut för att meddela prenumeranter. Denna händelse säkerställer att anställda bara meddelas efter att massinsättningen har bearbetats framgångsrikt, vilket ökar tillförlitligheten till meddelandesystemet. 🌟
På frontend lyssnar React-komponenten på de serversända händelserna genom en EventSource. När anställda meddelas uppdateras deras uppgifter dynamiskt i användargränssnittet utan att en sida behöver uppdateras. Detta tillvägagångssätt ger en sömlös användarupplevelse, som liknar realtidsuppdateringar som ses i moderna webbapplikationer som livesportresultat eller aviseringar på sociala medier. Till exempel kommer anställda på HR-avdelningen inte att se uppdateringar avsedda för försäljning, eftersom backend exakt filtrerar händelser baserat på tilldelningskriterier. Denna specificitet förbättrar både prestanda och relevans, vilket skapar ett användarfokuserat system. 🖥️
Skicka meddelanden i bulk med Server-Side Events (SSE) i NestJS
Denna lösning demonstrerar en backend-metod för att använda NestJS med Prisma och Server-Side Events (SSE) för bulkoperationer. Det inkluderar en händelsedriven arkitektur och kösystem.
// 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 })),
);
}
}
Realtidsuppdateringar för bulkinserts med NestJS och React
Detta frontend-exempel använder React för att lyssna på Server-Side Events och uppdatera användargränssnittet dynamiskt när data tas emot. Det säkerställer att anställda får meddelande i realtid efter massinsättningar.
// 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;
Aviseringar om enhetstestning för bulkinsertoperationer
Detta Jest-test säkerställer att händelseutsändnings- och meddelandemekanismen fungerar korrekt i backend för Server-Side Events i 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);
});
});
Förbättra realtidssystem med SSE i NestJS
Medan vi har undersökt implementeringen av Server-Side Events (SSE) för att meddela anställda om voucherallokering, finns det ett bredare användningsfall för SSE i realtidssystem. SSE lyser i scenarier där klienter behöver hålla sig uppdaterade med serverdata utan ständig polling. Tänk till exempel på en online-återförsäljningsplattform som spårar lageruppdateringar under en snabbrea. Med hjälp av SSE kan du effektivt skicka uppdateringar till alla anslutna klienter, så att de ser de senaste lagernivåerna utan onödig serverbelastning. Detta tillvägagångssätt säkerställer skalbarhet samtidigt som användarupplevelsen hålls sömlös. 🛒
Inkorporerar avancerade kösystem som BullMQ, som vi gjorde med allot-voucher kö, ger robusthet till bulkdatabearbetningsuppgifter. Kön säkerställer att även om en serverstart inträffar, förblir väntande uppgifter intakta och bearbetningen återupptas. Dessutom kan mekanismer för återförsök konfigureras, vilket säkerställer att misslyckade jobb (t.ex. på grund av tillfällig databasnedtid) testas igen automatiskt. Till exempel, om en allokering till 300 anställda på olika avdelningar stöter på ett tillfälligt fel, säkerställer köns motståndskraft att inga poster lämnas obearbetade, vilket ger ditt system tillförlitlighet.
Utöver realtidsmeddelanden kan SSE även komplettera e-posttjänster för uppgifter som kräver detaljerade sammanfattningar. Efter att alla verifikationsmeddelanden har skickats via SSE, kan backend asynkront generera en rapport och skicka ett konsoliderat e-postmeddelande till chefer. Denna flerkanalskommunikation säkerställer både omedelbara meddelanden och omfattande uppföljningar, vilket tillgodoser ett brett spektrum av användarpreferenser. Sådan integration förbättrar ditt systems flexibilitet och skapar en väl avrundad användarupplevelse. 📧
Vanliga frågor om SSE i NestJS
- Vilka är fördelarna med att använda Server-Side Events över WebSockets?
- SSE är enklare att implementera och använder HTTP, vilket gör det brandväggsvänligt. Till skillnad från WebSockets kräver den bara en enkel enkelriktad anslutning, vilket är effektivt för realtidsuppdateringar.
- Kan jag använda @Sse med flera slutpunkter i en styrenhet?
- Ja, du kan definiera flera @Sse slutpunkter i samma styrenhet för att servera olika dataströmmar till klienter baserat på specifika behov.
- Hur hanterar jag fel under köbehandling?
- Med BullMQ kan du definiera omförsöksalternativ och använda händelseavlyssnare som @OnWorkerEvent('failed') att logga fel och bearbeta jobb om det behövs.
- Gör Prisma's createMany metod stöder återföring av transaktioner?
- Ja, hos Prisma createMany kan slås in i en transaktion. Om någon operation i transaktionen misslyckas rullas alla operationer tillbaka för konsekvens.
- Vad händer om klienten kopplar från under en SSE-ström?
- Servern slutar skicka uppdateringar när den upptäcker frånkopplingen. Du kan implementera återanslutningslogik på klienten med hjälp av EventSource API.
- Kan SSE användas för tvåvägskommunikation?
- Nej, SSE är enkelriktad (server-till-klient). För dubbelriktad kommunikation, använd WebSockets eller HTTP2-strömmar.
- Hur säkrar jag SSE-ändpunkter i NestJS?
- Använd skydd eller mellanvaror, som @UseGuards, för att genomdriva autentisering och auktorisering för dina SSE-slutpunkter.
- Kan SSE fungera med klienter som inte är webbläsare?
- Ja, alla klienter som stöder HTTP och händelseströmning (t.ex. Node.js, cURL) kan konsumera SSE-strömmar.
- Vad är det maximala antalet klienter som kan ansluta till en SSE-slutpunkt?
- Detta beror på din servers konfiguration och resursbegränsningar. Lastbalansering och klustring kan hjälpa till att skala för att stödja fler kunder.
- Är det möjligt att skicka JSON-data över SSE?
- Ja, du kan serialisera objekt till JSON-strängar och skicka dem med hjälp av new MessageEvent i NestJS.
Effektiva realtidsmeddelanden i NestJS
Implementering av realtidssystem med hjälp av SSE i NestJS förenklar kommunikationen mellan servern och klienterna. Denna metod minskar serverbelastningen jämfört med konstant polling och möjliggör exakt inriktning för aviseringar. Ett HR-verktyg kan till exempel meddela 200 anställda i Sales om nya vouchers utan att störa andra. 🎯
Med verktyg som BullMQ och Prisma säkerställer denna installation asynkron uppgiftsbehandling och effektiv databasoperation. Flexibiliteten hos händelsebaserad arkitektur gör den till en skalbar lösning för olika realtidskrav, vilket ökar användarens engagemang och systemets tillförlitlighet.
Källor och referenser
- Detaljerad dokumentation om NestJS Framework för att bygga skalbara applikationer på serversidan.
- Guide för användning BullMQ för robust jobbköhantering i Node.js-applikationer.
- Officiell Prisma Dokumentation för databasoperationer och ORM-användning.
- Insikter om Serversända händelser (SSE) för realtidskommunikation mellan klient och server.
- Praktiska frontend-implementeringsexempel från ReactJS dokumentation för att bygga interaktiva användargränssnitt.