$lang['tuto'] = "tutorials"; ?> Notificacions sense esforç a NestJS mitjançant

Notificacions sense esforç a NestJS mitjançant esdeveniments del servidor per a operacions massives

Temp mail SuperHeros
Notificacions sense esforç a NestJS mitjançant esdeveniments del servidor per a operacions massives
Notificacions sense esforç a NestJS mitjançant esdeveniments del servidor per a operacions massives

Lliurament de notificacions simplificat per a operacions d'inserció massiva

Imagineu-vos que esteu gestionant un sistema on centenars d'empleats se'ls assignen vals en funció de diversos criteris com ara el departament, la qualificació o l'experiència. És una tasca colossal notificar a cada empleat de manera eficient sense causar colls d'ampolla al sistema. 🔔 Aquest repte es fa encara més descoratjador quan pretén evitar les complexitats dels endolls o els mecanismes de votació.

En aquests escenaris, els esdeveniments del costat del servidor (SSE) sorgeixen com una solució potent però senzilla. En aprofitar l'SSE a la vostra aplicació NestJS, podeu establir un canal de comunicació en temps real per notificar grups específics d'empleats segons criteris dinàmics. Per exemple, quan els vals s'assignen al departament de vendes, només aquests empleats haurien de rebre notificacions, garantint actualitzacions precises i significatives.

A través d'aquest article, ens endinsarem en un exemple pràctic que demostra com integrar SSE en un procés d'inserció massiva mitjançant NestJS. Recorrerem el cicle de vida, des de l'activació d'esdeveniments al backend fins a l'escolta d'actualitzacions al frontend, tot mantenint un rendiment perfecte. 💼

Tant si esteu desenvolupant una eina de recursos humans com una aplicació financera, entendre aquest flux de treball us permetrà enviar notificacions personalitzades en temps real. Desvelem la simplicitat de l'SSE i com pot millorar l'experiència d'usuari de la vostra aplicació.

Comandament Exemple d'ús
@Sse Un decorador NestJS utilitzat per definir un punt final d'esdeveniments del costat del servidor (SSE). Per exemple, @Sse('empleat-acreditat') configura un punt final per transmetre actualitzacions en temps real al client.
fromEvent Una funció de RxJS que converteix un esdeveniment emès per un Emissor d'esdeveniments en un corrent observable. Per exemple, fromEvent(this.eventEmitter, 'després-afegit-voucher') escolta un esdeveniment concret.
Observable Un concepte bàsic de RxJS utilitzat per gestionar fluxos de dades asíncrons. És essencial per gestionar els esdeveniments del servidor a NestJS, com ara Observable<MessageEvent>.
@InjectQueue Un decorador NestJS que injecta una instància de cua, útil per gestionar el processament de treballs amb biblioteques com Bull. Per exemple, @InjectQueue('allotVoucher') proporciona accés a la cua anomenada 'allotVoucher'.
WorkerHost Una classe base de BullMQ que permet definir processadors de treballs personalitzats a NestJS. Per exemple, el AllotVoucherConsumer la classe s'estén WorkerHost per fer càrrecs concrets.
@OnWorkerEvent Un decorador solia escoltar esdeveniments específics del cicle de vida d'un treball de cua. Per exemple, @OnWorkerEvent('completat') gestiona l'esdeveniment "completat" d'una feina.
createMany Una ordre Prisma que s'utilitza per inserir diversos registres en una base de dades alhora. Per exemple, Prisma.Val d'empleat.createMany afegeix els vals de tots els empleats en una sola operació.
EventSource Una API de JavaScript per rebre esdeveniments enviats pel servidor (SSE) des del backend. Per exemple, nou EventSource('http://localhost/vouchered-employee') estableix una connexió per a la transmissió de dades.
add Un mètode de Bull queues per afegir una feina nova a la cua. Per exemple, allotVoucherQueue.add('allot-voucher', jobData) programa un treball per a la seva tramitació.
@OnEvent Un decorador NestJS que escolta esdeveniments específics emesos dins de l'aplicació. Per exemple, @OnEvent('després-assignar-voucher') activa un mètode quan s'emet aquest esdeveniment.

Notificacions eficients amb esdeveniments i cues del servidor

Els scripts proporcionats il·lustren un sistema on s'envien notificacions en temps real als empleats després de la inserció massiva de registres de val a la base de dades. El procés comença al AssignaVoucherController, que exposa un punt final per crear tasques d'assignació de vals. Quan es crea una tasca, emet un esdeveniment anomenat després-assignar-val. Aquest esdeveniment és essencial per desencadenar els passos posteriors, assegurant que el sistema està basat en esdeveniments i modular. Aquest disseny permet una clara separació de les preocupacions, fent que el sistema sigui més fàcil de mantenir i escalable. 🎯

A la capa de servei, el AllocateVoucherService gestiona la lògica per posar en cua les tasques mitjançant BullMQ. Després de rebre el després-assignar-val esdeveniment, afegeix un treball a la cua anomenada assignar-val. Aquesta cua permet un processament asíncron, assegurant que el sistema segueix sent sensible fins i tot quan es processen grans conjunts de dades. Per exemple, si assigneu vals a 200 empleats del departament de vendes, la cua assegura que l'operació no bloqueja altres sol·licituds. La configuració de la cua inclou opcions com ara removeOnComplete per mantenir net Redis després de finalitzar el treball.

Els treballs de la cua són processats pel AllotVoucherConsumer classe. Aquí s'implementa la lògica per identificar els empleats rellevants i inserir registres de val a la base de dades. El comandament Prisma crearMoltes s'utilitza per inserir registres per lots al fitxer Val d'empleat taula, que està optimitzada per al rendiment. Un cop finalitzada l'operació de la base de dades, s'emet un altre esdeveniment per notificar als subscriptors. Aquest esdeveniment garanteix que els empleats només rebin una notificació després que la inserció massiva s'hagi processat correctament, afegint fiabilitat al sistema de notificacions. 🌟

A la interfície, el component React escolta els esdeveniments enviats pel servidor mitjançant un EventSource. A mesura que els empleats reben una notificació, els seus detalls s'actualitzen dinàmicament a la interfície d'usuari sense necessitat d'actualitzar la pàgina. Aquest enfocament ofereix una experiència d'usuari perfecta, semblant a les actualitzacions en temps real que es veuen a les aplicacions web modernes com els resultats esportius en directe o les notificacions de les xarxes socials. Per exemple, els empleats del departament de recursos humans no veuran les actualitzacions destinades a vendes, ja que el backend filtra precisament els esdeveniments en funció dels criteris d'assignació. Aquesta especificitat millora tant el rendiment com la rellevància, creant un sistema centrat en l'usuari. 🖥️

Enviament de notificacions a granel amb esdeveniments del servidor (SSE) a NestJS

Aquesta solució demostra un enfocament de backend per utilitzar NestJS amb Prisma i esdeveniments del costat del servidor (SSE) per a operacions massives. Inclou una arquitectura basada en esdeveniments i un sistema de cues.

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

Actualitzacions en temps real per a insercions massives amb NestJS i React

Aquest exemple d'interfície utilitza React per escoltar esdeveniments del servidor i actualitzar la interfície d'usuari de manera dinàmica a mesura que es reben dades. Assegura que els empleats rebin notificacions en temps real després de les insercions massives.

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

Notificacions de proves d'unitat per a operacions d'inserció massiva

Aquesta prova Jest garanteix que el mecanisme d'emissió i notificació d'esdeveniments funcioni correctament al backend per als esdeveniments del servidor a 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);
  });
});

Millora dels sistemes en temps real amb SSE a NestJS

Tot i que hem explorat la implementació d'Esdeveniments del costat del servidor (SSE) per notificar als empleats sobre l'assignació de vals, hi ha un cas d'ús més ampli per a SSE en sistemes en temps real. SSE brilla en escenaris en què els clients necessiten mantenir-se actualitzats amb les dades del servidor sense enquestar constantment. Per exemple, penseu en una plataforma minorista en línia que fa un seguiment de les actualitzacions d'inventari en directe durant una venda flash. Mitjançant l'SSE, podeu enviar actualitzacions de manera eficient a tots els clients connectats, assegurant-vos que vegin els darrers nivells d'estoc sense càrrega innecessària del servidor. Aquest enfocament garanteix l'escalabilitat alhora que manté l'experiència de l'usuari perfecta. 🛒

Incorporació de sistemes de cua avançats com BullMQ, com vam fer amb el assignar-val cua, afegeix robustesa a les tasques de processament de dades massives. La cua assegura que, fins i tot si es reinicia el servidor, les tasques pendents romandran intactes i el processament es reprendrà. A més, es poden configurar mecanismes de reintent, assegurant-se que les feines fallides (p. ex., a causa del temps d'inactivitat temporal de la base de dades) es tornen a intentar automàticament. Per exemple, si una assignació a 300 empleats entre departaments troba un error temporal, la resistència de la cua assegura que no es deixin registres sense processar, afegint fiabilitat al vostre sistema.

Més enllà de les notificacions en temps real, SSE també pot complementar els serveis de correu electrònic per a tasques que requereixen resums detallats. Després d'enviar totes les notificacions de val mitjançant SSE, el backend pot generar un informe de manera asíncrona i enviar un correu electrònic consolidat als gestors. Aquesta comunicació multicanal garanteix tant notificacions immediates com seguiments complets, atenent una àmplia gamma de preferències de l'usuari. Aquesta integració millora la flexibilitat del vostre sistema, creant una experiència d'usuari completa. 📧

Preguntes freqüents sobre SSE a NestJS

  1. Quins són els avantatges d'utilitzar Esdeveniments del costat del servidor sobre WebSockets?
  2. SSE és més senzill d'implementar i utilitza HTTP, per la qual cosa és amigable amb el tallafoc. A diferència de WebSockets, només requereix una única connexió unidireccional, que és eficient per a actualitzacions en temps real.
  3. Puc utilitzar @Sse amb diversos punts finals en un controlador?
  4. Sí, podeu definir múltiples @Sse punts finals del mateix controlador per servir diferents fluxos de dades als clients en funció de les necessitats específiques.
  5. Com puc gestionar els errors durant el processament de la cua?
  6. Amb BullMQ, podeu definir opcions de reintentar i utilitzar escoltes d'esdeveniments com @OnWorkerEvent('failed') per registrar errors i tornar a processar treballs si cal.
  7. El de Prisma createMany mètode admet retrocessos de transaccions?
  8. Sí, la de Prisma createMany es pot embolicar en una transacció. Si alguna operació de la transacció falla, totes les operacions es revertiran per a la coherència.
  9. Què passa si el client es desconnecta durant un flux SSE?
  10. El servidor deixa d'enviar actualitzacions un cop detecta la desconnexió. Podeu implementar la lògica de reconnexió al client mitjançant el EventSource API.
  11. Es pot utilitzar SSE per a la comunicació bidireccional?
  12. No, SSE és unidireccional (de servidor a client). Per a la comunicació bidireccional, utilitzeu WebSockets o fluxos HTTP2.
  13. Com puc protegir els punts finals SSE a NestJS?
  14. Utilitzeu guàrdies o intermedis, com ara @UseGuards, per fer complir l'autenticació i l'autorització per als vostres punts finals SSE.
  15. Pot SSE treballar amb clients que no són de navegador?
  16. Sí, qualsevol client que admeti HTTP i streaming d'esdeveniments (p. ex., Node.js, cURL) pot consumir fluxos SSE.
  17. Quin és el nombre màxim de clients que es poden connectar a un punt final SSE?
  18. Això depèn de la configuració del servidor i dels límits de recursos. L'equilibri de càrrega i l'agrupació poden ajudar a escalar per donar suport a més clients.
  19. És possible enviar dades JSON a través de SSE?
  20. Sí, podeu serialitzar objectes a cadenes JSON i enviar-los mitjançant new MessageEvent a NestJS.

Notificacions efectives en temps real a NestJS

Implementació de sistemes en temps real utilitzant SSE a NestJS simplifica la comunicació entre el servidor i els clients. Aquest mètode redueix la càrrega del servidor en comparació amb l'enquesta constant i permet una orientació precisa de les notificacions. Per exemple, una eina de recursos humans pot notificar a 200 empleats de Vendes sobre nous vals sense interrompre els altres. 🎯

Amb eines com BullMQ i Prisma, aquesta configuració garanteix un processament asíncron de tasques i operacions eficients de la base de dades. La flexibilitat de l'arquitectura basada en esdeveniments la converteix en una solució escalable per a diversos requisits en temps real, millorant la implicació dels usuaris i la fiabilitat del sistema.

Fonts i referències
  1. Documentació detallada sobre Marc NestJS per crear aplicacions escalables del costat del servidor.
  2. Guia d'ús BullMQ per a una gestió robusta de la cua de treballs a les aplicacions Node.js.
  3. Oficial Documentació Prisma per a operacions de bases de dades i ús d'ORM.
  4. Estadístiques sobre Esdeveniments enviats pel servidor (SSE) per a la comunicació client-servidor en temps real.
  5. Exemples pràctics d'implementació d'interfície de l' Documentació de ReactJS per crear interfícies d'usuari interactives.