Könnyű értesítések a NestJS-ben szerveroldali események használatával tömeges műveletekhez

Temp mail SuperHeros
Könnyű értesítések a NestJS-ben szerveroldali események használatával tömeges műveletekhez
Könnyű értesítések a NestJS-ben szerveroldali események használatával tömeges műveletekhez

Egyszerűsített értesítések kézbesítése tömeges beszúrási műveletekhez

Képzelje el, hogy Ön egy olyan rendszert kezel, amelyben több száz alkalmazott kap kuponokat különféle kritériumok, például osztály, besorolás vagy tapasztalat alapján. Kolosszális feladat minden alkalmazottat hatékonyan értesíteni anélkül, hogy szűk keresztmetszeteket okozna a rendszerben. 🔔 Ez a kihívás még ijesztőbbé válik, ha az aljzatok vagy a lekérdezési mechanizmusok bonyolultságát szeretné elkerülni.

Ilyen esetekben a kiszolgálóoldali események (SSE) hatékony, de egyszerű megoldásként jelennek meg. Ha az SSE-t a NestJS-alkalmazásban kihasználja, valós idejű kommunikációs csatornát hozhat létre az alkalmazottak meghatározott csoportjainak dinamikus kritériumok alapján történő értesítéséhez. Például, amikor utalványokat osztanak ki az értékesítési osztálynak, csak az alkalmazottak kaphatnak értesítést, biztosítva a pontos és értelmes frissítéseket.

Ebben a cikkben egy gyakorlati példát mutatunk be, amely bemutatja, hogyan integrálható az SSE egy tömeges beillesztési folyamatba a NestJS használatával. Végigjárjuk az életciklust, a háttérben zajló események kiváltásától a kezelőfelület frissítéseinek meghallgatásáig, mindezt úgy, hogy közben megőrizzük a zökkenőmentes teljesítményt. 💼

Akár HR-eszközt, akár pénzügyi alkalmazást fejleszt, ennek a munkafolyamatnak a megértése lehetővé teszi, hogy valós időben személyre szabott értesítéseket küldjön. Nézzük meg az SSE egyszerűségét, és azt, hogy miként javíthatja alkalmazása felhasználói élményét.

Parancs Használati példa
@Sse A szerveroldali események (SSE) végpontjának meghatározására használt NestJS-dekorátor. Például, @Sse('utalványos alkalmazott') beállít egy végpontot, amely valós idejű frissítéseket küld az ügyfélnek.
fromEvent Az RxJS függvénye, amely átalakítja az egy által kibocsátott eseményt EventEmitter egy megfigyelhető patakba. Például, fromEvent(this.eventEmitter, 'after-added-voucher') egy adott eseményre figyel.
Observable Az RxJS alapkoncepciója, amelyet az aszinkron adatfolyamok kezelésére használnak. Elengedhetetlen a szerveroldali események NestJS-ben történő kezeléséhez, például Megfigyelhető<MessageEvent>.
@InjectQueue Egy NestJS-dekorátor, amely egy sorpéldányt szúr be, és hasznos a feladatfeldolgozás kezeléséhez olyan könyvtárakkal, mint a Bull. Például, @InjectQueue('allotVoucher') hozzáférést biztosít az „allotVoucher” nevű sorhoz.
WorkerHost A BullMQ alaposztálya, amely lehetővé teszi egyéni feladatfeldolgozók meghatározását a NestJS-ben. Például a AllotVoucherConsumer osztály meghosszabbodik WorkerHost meghatározott munkák kezelésére.
@OnWorkerEvent Egy lakberendező egy sormunka adott életciklus-eseményét hallgatta meg. Például, @OnWorkerEvent('befejezve') egy munka "befejezett" eseményét kezeli.
createMany Egy Prisma parancs, amellyel egyszerre több rekordot illeszthet be egy adatbázisba. Például, prisma.employee Voucher.createMany egyetlen műveletben hozzáadja az összes alkalmazott utalványát.
EventSource JavaScript API a szerver által küldött események (SSE) fogadására a háttérrendszerből. Például, new EventSource('http://localhost/vouchered-employee') kapcsolatot létesít az adatok streameléséhez.
add A Bull queues-ból származó metódus új feladat hozzáadására a sorhoz. Például, allotVoucherQueue.add('allot-voucher', jobData) feladatot ütemez feldolgozásra.
@OnEvent Egy NestJS-dekorátor, amely figyel az alkalmazáson belül kibocsátott konkrét eseményekre. Például, @OnEvent('utalvány kiosztása') egy metódust indít el, amikor ez az esemény kibocsátásra kerül.

Hatékony értesítések szerveroldali eseményekkel és sorokkal

A rendelkezésre álló szkriptek egy olyan rendszert illusztrálnak, ahol valós idejű értesítéseket küldenek az alkalmazottak az utalványrekordok adatbázisba történő tömeges beillesztése után. A folyamat a Allocate VoucherController, amely egy végpontot tesz közzé az utalványkiosztási feladatok létrehozásához. A feladat létrehozásakor egy eseményt bocsát ki utókiosztás-utalvány. Ez az esemény elengedhetetlen a következő lépések elindításához, biztosítva, hogy a rendszer eseményvezérelt és moduláris legyen. Ez a kialakítás lehetővé teszi a problémák egyértelmű szétválasztását, így a rendszer karbantarthatóbbá és méretezhetőbbé válik. 🎯

A szolgáltatási rétegben a Allocate VoucherService kezeli a feladatok sorba állítási logikáját a BullMQ használatával. Miután megkapta a utókiosztás-utalvány eseményt, felvesz egy feladatot a megnevezett sorba kiosztási utalvány. Ez a sor lehetővé teszi az aszinkron feldolgozást, biztosítva, hogy a rendszer még nagy adatkészletek feldolgozása esetén is reagáljon. Például, ha utalványokat oszt ki 200 alkalmazotthoz az értékesítési osztályon, a sor biztosítja, hogy a művelet ne blokkolja a többi kérést. A sor konfigurációja olyan opciókat tartalmaz, mint pl RemoveOnComplete hogy Redis tisztán tartsa a munka befejezése után.

A sorfeladatokat a AllotVoucherConsumer osztály. Itt valósul meg az érintett munkavállalók azonosításának és az utalványrekordoknak az adatbázisba történő beillesztésének logikája. A Prisma parancs létrehozniSok rekordok kötegelt beszúrására használják a munkavállalói utalvány táblázat, amely a teljesítményre van optimalizálva. Az adatbázis-művelet befejeződése után egy másik esemény kerül kiadásra az előfizetők értesítésére. Ez az esemény biztosítja, hogy az alkalmazottak csak a tömeges beillesztés sikeres feldolgozása után kapjanak értesítést, növelve az értesítési rendszer megbízhatóságát. 🌟

Az előtérben a React összetevő figyeli a szerver által küldött eseményeket egy EventSource. Amint az alkalmazottak értesítést kapnak, adataik dinamikusan frissülnek a felhasználói felületen anélkül, hogy szükség lenne az oldal frissítésére. Ez a megközelítés zökkenőmentes felhasználói élményt biztosít, hasonlóan a modern webalkalmazásokban látható valós idejű frissítésekhez, mint például az élő sporteredmények vagy a közösségi média értesítései. Például a HR részleg alkalmazottai nem látják az értékesítésnek szánt frissítéseket, mivel a háttérrendszer pontosan szűri az eseményeket az elosztási feltételek alapján. Ez a sajátosság növeli a teljesítményt és a relevanciát egyaránt, felhasználó-központú rendszert hozva létre. 🖥️

Értesítések tömeges küldése szerveroldali eseményekkel (SSE) a NestJS-ben

Ez a megoldás a NestJS Prismával és szerveroldali eseményekkel (SSE) való használatának háttérrendszerét mutatja be tömeges műveletekhez. Eseményvezérelt architektúrát és sorban állási rendszert tartalmaz.

// 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 })),
    );
  }
}

Valós idejű frissítések tömeges beszúrásokhoz a NestJS és a React használatával

Ez a frontend példa a React segítségével figyeli a szerveroldali eseményeket, és dinamikusan frissíti a felhasználói felületet az adatok fogadásakor. Biztosítja, hogy az alkalmazottak valós időben kapjanak értesítést a tömeges beszúrások után.

// 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;

Egységtesztelési értesítések tömeges beszúrási műveletekhez

Ez a Jest-teszt biztosítja, hogy az eseménykibocsátási és értesítési mechanizmus megfelelően működjön a NestJS szerveroldali események háttérrendszerében.

// 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);
  });
});

Valós idejű rendszerek fejlesztése SSE segítségével a NestJS-ben

Miközben megvizsgáltuk a kiszolgálóoldali események (SSE) megvalósítását az alkalmazottak értesítésére az utalványok kiosztásáról, az SSE-nek szélesebb köre van a valós idejű rendszerekben. Az SSE olyan forgatókönyvekben tündököl, amikor az ügyfeleknek folyamatos lekérdezés nélkül kell naprakészen tartaniuk a szerveradatokat. Gondoljon például egy online kiskereskedelmi platformra, amely nyomon követi az élő készletfrissítéseket egy gyorsakció során. Az SSE használatával hatékonyan küldheti a frissítéseket az összes csatlakoztatott kliensnek, így biztosítva, hogy a legfrissebb készletszinteket a szerver szükségtelen terhelése nélkül tekintsék meg. Ez a megközelítés biztosítja a méretezhetőséget, miközben zökkenőmentesen tartja a felhasználói élményt. 🛒

Fejlett sorban állási rendszerek beépítése, mint például a BullMQ, ahogyan azt a kiosztási utalvány sor, robusztusabbá teszi a tömeges adatfeldolgozási feladatokat. A várólista gondoskodik arról, hogy a függőben lévő feladatok érintetlenek maradjanak a kiszolgáló újraindítása esetén is, és a feldolgozás folytatódjon. Ezenkívül konfigurálhatók az újrapróbálkozási mechanizmusok, amelyek biztosítják, hogy a sikertelen feladatok (például az adatbázis ideiglenes leállása miatt) automatikusan újrapróbálkozhassanak. Például, ha a részlegek közötti 300 alkalmazotthoz való hozzárendelés átmeneti hibába ütközik, a sor rugalmassága biztosítja, hogy egyetlen rekord se maradjon feldolgozatlanul, ami növeli a rendszer megbízhatóságát.

A valós idejű értesítéseken túl az SSE az e-mail szolgáltatásokat is kiegészítheti a részletes összefoglalót igénylő feladatoknál. Miután az összes utalványértesítést elküldték az SSE-n keresztül, a háttérrendszer aszinkron módon jelentést készíthet, és összevont e-mailt küldhet a vezetőknek. Ez a többcsatornás kommunikáció azonnali értesítést és átfogó nyomon követést biztosít, a felhasználói preferenciák széles skáláját kielégítve. Az ilyen integráció növeli a rendszer rugalmasságát, és teljes körű felhasználói élményt biztosít. 📧

Gyakran ismételt kérdések az SSE-ről a NestJS-ben

  1. Milyen előnyei vannak a szerveroldali események használatának a WebSocketekkel szemben?
  2. Az SSE megvalósítása egyszerűbb, és HTTP-t használ, így tűzfalbarát. A WebSocketstől eltérően csak egyetlen egyirányú kapcsolat szükséges, ami hatékony a valós idejű frissítésekhez.
  3. Használhatom @Sse több végponttal egy vezérlőben?
  4. Igen, több is megadható @Sse végpontok ugyanabban a vezérlőben, hogy különböző adatfolyamokat szolgáltassanak ki az ügyfelek számára egyedi igények alapján.
  5. Hogyan kezelhetem a sorfeldolgozás során fellépő hibákat?
  6. A BullMQ segítségével újrapróbálkozási lehetőségeket határozhat meg, és például eseményfigyelőket használhat @OnWorkerEvent('failed') a hibák naplózására és a feladatok újrafeldolgozására, ha szükséges.
  7. A Prismáé createMany módszer-támogatási tranzakció-visszaállítások?
  8. Igen, a Prismáé createMany tranzakcióba burkolható. Ha a tranzakció bármely művelete meghiúsul, az összes műveletet a rendszer visszaállítja a következetesség érdekében.
  9. Mi történik, ha az ügyfél megszakad az SSE adatfolyam közben?
  10. A kiszolgáló leállítja a frissítések küldését, amint észleli a kapcsolat megszakadását. Az újracsatlakozási logikát a kliens segítségével valósíthatja meg EventSource API.
  11. Használható az SSE kétirányú kommunikációra?
  12. Nem, az SSE egyirányú (szerver-kliens). Kétirányú kommunikációhoz használjon WebSockets vagy HTTP2 adatfolyamokat.
  13. Hogyan biztosíthatom az SSE-végpontokat a NestJS-ben?
  14. Használjon védőeszközöket vagy köztes szoftvereket, mint pl @UseGuards, az SSE-végpontok hitelesítésének és engedélyezésének kényszerítéséhez.
  15. Működhet az SSE nem böngésző kliensekkel?
  16. Igen, minden olyan ügyfél, amely támogatja a HTTP-t és az események adatfolyamát (pl. Node.js, cURL), használhat SSE adatfolyamokat.
  17. Maximum hány ügyfelek csatlakozhatnak egy SSE-végponthoz?
  18. Ez a szerver konfigurációjától és az erőforrás-korlátoktól függ. A terheléselosztás és a klaszterezés segíthet a méretezésben, hogy több ügyfelet tudjon támogatni.
  19. Lehetséges JSON-adatokat küldeni SSE-n keresztül?
  20. Igen, sorba rendezheti az objektumokat JSON-karakterláncokká, és elküldheti őket new MessageEvent a NestJS-ben.

Hatékony valós idejű értesítések a NestJS-ben

Valós idejű rendszerek megvalósítása segítségével SSE a NestJS-ben leegyszerűsíti a kommunikációt a szerver és az ügyfelek között. Ez a módszer csökkenti a szerver terhelését az állandó lekérdezéshez képest, és lehetővé teszi az értesítések pontos célzását. Például egy HR-eszköz 200 alkalmazottat értesíthet az értékesítésben az új utalványokról anélkül, hogy megzavarna másokat. 🎯

Az olyan eszközökkel, mint a BullMQ és a Prisma, ez a beállítás biztosítja az aszinkron feladatfeldolgozást és a hatékony adatbázis-műveleteket. Az eseményalapú architektúra rugalmassága skálázható megoldássá teszi a különféle valós idejű követelményekhez, fokozva a felhasználók elkötelezettségét és a rendszer megbízhatóságát.

Források és hivatkozások
  1. Részletes dokumentáció a NestJS Framework méretezhető szerveroldali alkalmazások építéséhez.
  2. Használati útmutató BullMQ robusztus jobsor-kezeléshez a Node.js alkalmazásokban.
  3. Hivatalos Prisma dokumentáció adatbázis-műveletekhez és ORM-használathoz.
  4. Insights on Szerver által küldött események (SSE) valós idejű kliens-szerver kommunikációhoz.
  5. Gyakorlati frontend megvalósítási példák a ReactJS dokumentáció interaktív felhasználói felületek építéséhez.