Virtaviivainen ilmoitusten toimitus joukkolisäystoimintoihin
Kuvittele, että hallitset järjestelmää, jossa sadat työntekijät saavat tositteita eri kriteerien, kuten osaston, palkkaluokan tai kokemuksen, perusteella. On valtava tehtävä ilmoittaa jokaiselle työntekijälle tehokkaasti aiheuttamatta pullonkauloja järjestelmään. 🔔 Tämä haaste tulee vieläkin pelottavammaksi, kun pyrit välttämään pistorasioiden tai kyselymekanismien monimutkaisuutta.
Tällaisissa skenaarioissa Server-Side Events (SSE) on tehokas mutta yksinkertainen ratkaisu. Hyödyntämällä SSE:tä NestJS-sovelluksessasi voit luoda reaaliaikaisen viestintäkanavan ilmoittaaksesi tietyille työntekijäryhmille dynaamisten kriteerien perusteella. Esimerkiksi kun tositteet jaetaan myyntiosastolle, vain näiden työntekijöiden tulisi saada ilmoituksia, mikä varmistaa tarkat ja merkitykselliset päivitykset.
Tämän artikkelin kautta sukeltaamme käytännön esimerkkiin, joka osoittaa, kuinka SSE integroidaan joukkolisäysprosessiin NestJS:n avulla. Kävelemme läpi koko elinkaaren taustajärjestelmän tapahtumien käynnistämisestä käyttöliittymän päivitysten kuuntelemiseen, samalla kun ylläpidämme saumatonta suorituskykyä. 💼
Olitpa kehittämässä HR-työkalua tai rahoitussovellusta, tämän työnkulun ymmärtäminen antaa sinulle mahdollisuuden toimittaa henkilökohtaisia ilmoituksia reaaliajassa. Selvitetään SSE:n yksinkertaisuus ja kuinka se voi parantaa sovelluksesi käyttökokemusta.
Komento | Käyttöesimerkki |
---|---|
@Sse | NestJS-koristelija, jota käytetään palvelinpuolen tapahtumien (SSE) päätepisteen määrittämiseen. Esimerkiksi, @Sse('vouchered-employee') määrittää päätepisteen suoratoistamaan reaaliaikaisia päivityksiä asiakkaalle. |
fromEvent | RxJS:n funktio, joka muuntaa tapahtuman, jonka lähetti EventEmitter havaittavaan virtaan.
Esimerkiksi, fromEvent(this.eventEmitter, "after-added-voucher") kuuntelee tiettyä tapahtumaa. |
Observable | RxJS:n ydinkonsepti, jota käytetään asynkronisten tietovirtojen hallintaan.
Se on välttämätöntä palvelinpuolen tapahtumien käsittelemiseksi NestJS:ssä, kuten Havaittavissa<MessageEvent> . |
@InjectQueue | NestJS-koristelija, joka lisää jono-ilmentymän, joka on hyödyllinen Bullin kaltaisten kirjastojen töiden käsittelyn hallinnassa.
Esimerkiksi, @InjectQueue('allotVoucher') tarjoaa pääsyn jonoon nimeltä "allotVoucher". |
WorkerHost | BullMQ:n perusluokka, jonka avulla voidaan määrittää mukautettuja työsuorittimia NestJS:ssä.
Esimerkiksi, AllotVoucherConsumer luokka laajenee WorkerHost hoitaa tiettyjä töitä. |
@OnWorkerEvent | Sisustajalla oli tapana kuunnella tiettyjä jonotyön elinkaaren tapahtumia.
Esimerkiksi, @OnWorkerEvent('valmistunut') käsittelee työn "valmistuneen" tapahtuman. |
createMany | Prisma-komento, jolla lisätään useita tietueita tietokantaan kerralla.
Esimerkiksi, prisma.employee Voucher.createMany lisää kaikkien työntekijöiden kupongit yhdellä toiminnolla. |
EventSource | JavaScript-sovellusliittymä palvelimen lähettämien tapahtumien (SSE) vastaanottamiseen taustajärjestelmästä.
Esimerkiksi, new EventSource('http://localhost/vouchered-employee') muodostaa yhteyden suoratoistoa varten. |
add | Bull-jonojen menetelmä uuden työn lisäämiseksi jonoon.
Esimerkiksi, allotVoucherQueue.add('allot-voucher', jobData) ajoittaa työn käsittelyyn. |
@OnEvent | NestJS-sisustuslaite, joka kuuntelee tiettyjä sovelluksen sisältämiä tapahtumia.
Esimerkiksi, @OnEvent('jälkeen-alllocate-voucher') laukaisee menetelmän, kun tämä tapahtuma lähetetään. |
Tehokkaat ilmoitukset palvelinpuolen tapahtumilla ja jonoilla
Toimitetut skriptit havainnollistavat järjestelmää, jossa reaaliaikaiset ilmoitukset lähetetään työntekijöille sen jälkeen, kun tositteet on lisätty tietokantaan. Prosessi alkaa v AllocateVoucherController, joka paljastaa päätepisteen tositteen allokointitehtävien luomista varten. Kun tehtävä luodaan, se lähettää tapahtuman nimeltä jälkijako-kuponki. Tämä tapahtuma on välttämätön myöhempien vaiheiden käynnistämiseksi ja varmistaa, että järjestelmä on tapahtumalähtöinen ja modulaarinen. Tämä suunnittelu mahdollistaa huolenaiheiden selkeän erottelun, mikä tekee järjestelmästä ylläpidettävämmän ja skaalautuvamman. 🎯
Palvelutasolla AllocateVoucherService hoitaa tehtävien jonotuslogiikan BullMQ:n avulla. Saatuaan jälkijako-kuponki tapahtuma, se lisää työn jonoon nimeltä jakoseteli. Tämä jono mahdollistaa asynkronisen käsittelyn, mikä varmistaa, että järjestelmä pysyy reagoivana myös suuria tietojoukkoja käsiteltäessä. Jos esimerkiksi jaat tositteita 200 työntekijälle myyntiosastolla, jono varmistaa, että toiminto ei estä muita pyyntöjä. Jonon kokoonpano sisältää vaihtoehtoja, kuten RemoveOnComplete pitääksesi Redisin puhtaana työn valmistumisen jälkeen.
Jonotöitä käsittelee AllotVoucherConsumer luokkaa. Tässä toteutetaan logiikka asiaankuuluvien työntekijöiden tunnistamiseksi ja tositetietueiden lisäämiseksi tietokantaan. Prisman komento luo monta käytetään tietueiden eräsyöttöön työntekijän kuponki taulukko, joka on optimoitu suorituskykyä varten. Kun tietokantatoiminto on valmis, lähetetään toinen tapahtuma ilmoittamaan tilaajille. Tämä tapahtuma varmistaa, että työntekijät saavat ilmoituksen vasta, kun joukkolisäys on käsitelty onnistuneesti, mikä lisää ilmoitusjärjestelmän luotettavuutta. 🌟
Käyttöliittymässä React-komponentti kuuntelee palvelimen lähettämiä tapahtumia Tapahtumalähde. Kun työntekijöille ilmoitetaan, heidän tietonsa päivitetään dynaamisesti käyttöliittymässä ilman, että sivua tarvitsee päivittää. Tämä lähestymistapa tarjoaa saumattoman käyttökokemuksen, joka muistuttaa reaaliaikaisia päivityksiä, joita nähdään nykyaikaisissa verkkosovelluksissa, kuten live-urheilutuloksissa tai sosiaalisen median ilmoituksissa. Esimerkiksi HR-osaston työntekijät eivät näe myyntiin tarkoitettuja päivityksiä, koska taustajärjestelmä suodattaa tapahtumat tarkasti allokointikriteerien perusteella. Tämä erityisyys parantaa sekä suorituskykyä että osuvuutta luoden käyttäjäkeskeisen järjestelmän. 🖥️
Ilmoitusten lähettäminen joukkona palvelinpuolen tapahtumien (SSE) avulla NestJS:ssä
Tämä ratkaisu esittelee taustaratkaisun NestJS:n käyttämiseen Prisman ja SSE:n (Server-Side Events) kanssa joukkotoimintoihin. Se sisältää tapahtumalähtöisen arkkitehtuurin ja jonojärjestelmän.
// 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 })),
);
}
}
Reaaliaikaiset päivitykset joukkolisäkkeille NestJS:n ja Reactin avulla
Tämä käyttöliittymäesimerkki käyttää Reactia palvelinpuolen tapahtumien kuuntelemiseen ja käyttöliittymän päivittämiseen dynaamisesti, kun tietoja vastaanotetaan. Se varmistaa, että työntekijät saavat ilmoituksen reaaliajassa joukkolisäysten jälkeen.
// 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;
Yksikkötestausilmoitukset joukkolisäystoimintoihin
Tämä Jest-testi varmistaa, että tapahtumalähetys- ja ilmoitusmekanismi toimii oikein NestJS:n palvelinpuolen tapahtumien taustaohjelmassa.
// 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);
});
});
Reaaliaikaisten järjestelmien parantaminen SSE:llä NestJS:ssä
Vaikka olemme tutkineet palvelinpuolen tapahtumien (SSE) käyttöönottoa työntekijöiden ilmoittamiseksi kuponkien allokoinnista, SSE:llä on laajempi käyttökohde reaaliaikaisissa järjestelmissä. SSE loistaa skenaarioissa, joissa asiakkaiden on pysyttävä ajan tasalla palvelintiedoista ilman jatkuvaa kyselyä. Ajattele esimerkiksi verkkokaupan alustaa, joka seuraa reaaliaikaisia varastopäivityksiä flash-alennusten aikana. SSE:n avulla voit lähettää päivitykset tehokkaasti kaikille yhdistetyille asiakkaille ja varmistaa, että he näkevät uusimmat varastotasot ilman tarpeetonta palvelinkuormitusta. Tämä lähestymistapa varmistaa skaalautuvuuden ja pitää käyttökokemuksen saumattomana. 🛒
Sisällytetään kehittyneitä jonojärjestelmiä, kuten BullMQ, kuten teimme jakoseteli jonossa, lisää vankuutta joukkotietojen käsittelytehtäviin. Jono varmistaa, että vaikka palvelin käynnistetään uudelleen, odottavat tehtävät pysyvät ennallaan ja käsittely jatkuu. Lisäksi voidaan määrittää uudelleenyritysmekanismit, joilla varmistetaan, että epäonnistuneet työt (esim. tilapäisen tietokannan seisokkiajan vuoksi) yritetään uudelleen automaattisesti. Jos esimerkiksi jakamalla 300 työntekijää eri osastojen välillä ilmenee tilapäinen virhe, jonon joustavuus varmistaa, että mitään tietueita ei jätetä käsittelemättä, mikä lisää järjestelmän luotettavuutta.
Reaaliaikaisten ilmoitusten lisäksi SSE voi täydentää sähköpostipalveluita yksityiskohtaisia yhteenvetoja vaativissa tehtävissä. Kun kaikki kuponkiilmoitukset on lähetetty SSE:n kautta, taustaohjelma voi luoda asynkronisesti raportin ja lähettää yhdistetyn sähköpostin johtajille. Tämä monikanavainen viestintä varmistaa sekä välittömät ilmoitukset että kattavat seurannat, jotka vastaavat monenlaisia käyttäjien mieltymyksiä. Tällainen integrointi lisää järjestelmäsi joustavuutta ja luo monipuolisen käyttökokemuksen. 📧
Usein kysyttyjä kysymyksiä SSE:stä NestJS:ssä
- Mitä etuja on palvelinpuolen tapahtumien käyttämisestä WebSocketsiin verrattuna?
- SSE on helpompi toteuttaa ja käyttää HTTP:tä, mikä tekee siitä palomuuriystävällisen. Toisin kuin WebSockets, se vaatii vain yhden yksisuuntaisen yhteyden, joka on tehokas reaaliaikaisissa päivityksissä.
- Voinko käyttää @Sse jossa on useita päätepisteitä ohjaimessa?
- Kyllä, voit määrittää useita @Sse päätepisteet samassa ohjaimessa palvelemaan erilaisia tietovirtoja asiakkaille erityistarpeiden perusteella.
- Miten käsittelen virheitä jonon käsittelyn aikana?
- BullMQ:n avulla voit määrittää uudelleenyritysvaihtoehtoja ja käyttää tapahtumakuuntelijoita, kuten @OnWorkerEvent('failed') kirjaamaan virheet ja tarvittaessa käsittelemään työt uudelleen.
- Sopii Prismaan createMany menetelmätuen tapahtumien palautukset?
- Kyllä, Prismassa createMany voidaan kääriä kauppaan. Jos jokin tapahtuman toiminto epäonnistuu, kaikki toiminnot peruutetaan johdonmukaisuuden vuoksi.
- Mitä tapahtuu, jos asiakas katkaisee yhteyden SSE-streamin aikana?
- Palvelin lopettaa päivitysten lähettämisen, kun se havaitsee yhteyden katkeamisen. Voit toteuttaa uudelleenkytkentälogiikan asiakkaassa käyttämällä EventSource API.
- Voidaanko SSE:tä käyttää kaksisuuntaiseen viestintään?
- Ei, SSE on yksisuuntainen (palvelin-asiakas). Käytä kaksisuuntaiseen tiedonsiirtoon WebSockets- tai HTTP2-streameja.
- Kuinka suojaan SSE-päätepisteet NestJS:ssä?
- Käytä suojia tai välituotteita, kuten @UseGuards, pakottaaksesi SSE-päätepisteidesi todennuksen ja valtuutuksen.
- Voiko SSE toimia muiden kuin selainasiakkaiden kanssa?
- Kyllä, mikä tahansa asiakas, joka tukee HTTP:tä ja tapahtumien suoratoistoa (esim. Node.js, cURL), voi käyttää SSE-streameja.
- Mikä on asiakkaiden enimmäismäärä, jotka voivat muodostaa yhteyden SSE-päätepisteeseen?
- Tämä riippuu palvelimesi kokoonpanosta ja resurssirajoituksista. Kuormituksen tasapainottaminen ja klusterointi voivat auttaa skaalautumaan tukemaan useampia asiakkaita.
- Onko mahdollista lähettää JSON-tietoja SSE:n kautta?
- Kyllä, voit sarjoittaa objekteja JSON-merkkijonoihin ja lähettää ne käyttämällä new MessageEvent NestJS:ssä.
Tehokkaat reaaliaikaiset ilmoitukset NestJS:ssä
Reaaliaikaisten järjestelmien käyttöönotto käyttäen SSE NestJS:ssä yksinkertaistaa palvelimen ja asiakkaiden välistä viestintää. Tämä menetelmä vähentää palvelimen kuormitusta verrattuna jatkuvaan kyselyyn ja mahdollistaa ilmoitusten tarkan kohdistamisen. Esimerkiksi HR-työkalu voi ilmoittaa 200 myynnin työntekijälle uusista seteleistä häiritsemättä muita. 🎯
BullMQ:n ja Prisman kaltaisilla työkaluilla tämä asennus varmistaa asynkronisen tehtävien käsittelyn ja tehokkaan tietokantatoiminnan. Tapahtumapohjaisen arkkitehtuurin joustavuus tekee siitä skaalautuvan ratkaisun erilaisiin reaaliaikaisiin vaatimuksiin, mikä parantaa käyttäjien sitoutumista ja järjestelmän luotettavuutta.
Lähteet ja viitteet
- Yksityiskohtainen dokumentaatio aiheesta NestJS Framework skaalattavien palvelinpuolen sovellusten rakentamiseen.
- Käyttöopas BullMQ Node.js-sovelluksissa toimivaan työjonojen hallintaan.
- Virallinen Prisman dokumentaatio tietokantatoimintoihin ja ORM-käyttöön.
- Näkemyksiä aiheesta Palvelimen lähettämät tapahtumat (SSE) reaaliaikaiseen asiakas-palvelin-viestintään.
- Käytännön käyttöliittymän toteutusesimerkkejä ReactJS-dokumentaatio interaktiivisten käyttöliittymien rakentamiseen.