Ειδοποιήσεις χωρίς κόπο στο NestJS με χρήση συμβάντων από την πλευρά του διακομιστή για μαζικές λειτουργίες

Temp mail SuperHeros
Ειδοποιήσεις χωρίς κόπο στο NestJS με χρήση συμβάντων από την πλευρά του διακομιστή για μαζικές λειτουργίες
Ειδοποιήσεις χωρίς κόπο στο NestJS με χρήση συμβάντων από την πλευρά του διακομιστή για μαζικές λειτουργίες

Βελτιωμένη παράδοση ειδοποιήσεων για λειτουργίες μαζικής εισαγωγής

Φανταστείτε ότι διαχειρίζεστε ένα σύστημα όπου σε εκατοντάδες υπαλλήλους εκχωρούνται κουπόνια με βάση διάφορα κριτήρια όπως τμήμα, βαθμός ή εμπειρία. Είναι ένα κολοσσιαίο έργο να ειδοποιείς κάθε εργαζόμενο αποτελεσματικά χωρίς να προκαλείται συμφόρηση στο σύστημα. 🔔 Αυτή η πρόκληση γίνεται ακόμη πιο τρομακτική όταν στοχεύετε να αποφύγετε την πολυπλοκότητα των πριζών ή των μηχανισμών ψηφοφορίας.

Σε τέτοια σενάρια, τα Συμβάντα από την πλευρά του διακομιστή (SSE) εμφανίζονται ως μια ισχυρή αλλά απλή λύση. Αξιοποιώντας το SSE στην εφαρμογή NestJS, μπορείτε να δημιουργήσετε ένα κανάλι επικοινωνίας σε πραγματικό χρόνο για να ειδοποιήσετε συγκεκριμένες ομάδες εργαζομένων με βάση δυναμικά κριτήρια. Για παράδειγμα, όταν τα κουπόνια κατανέμονται στο τμήμα πωλήσεων, μόνο αυτοί οι εργαζόμενοι θα πρέπει να λαμβάνουν ειδοποιήσεις, διασφαλίζοντας ακριβείς και ουσιαστικές ενημερώσεις.

Μέσα από αυτό το άρθρο, θα εξετάσουμε ένα πρακτικό παράδειγμα που δείχνει πώς να ενσωματώσετε το SSE σε μια διαδικασία μαζικής εισαγωγής χρησιμοποιώντας το NestJS. Θα ακολουθήσουμε τον κύκλο ζωής, από την ενεργοποίηση συμβάντων στο backend έως την ακρόαση για ενημερώσεις στο frontend, όλα αυτά διατηρώντας την απρόσκοπτη απόδοση. 💼

Είτε αναπτύσσετε ένα εργαλείο ανθρώπινου δυναμικού είτε μια εφαρμογή χρηματοδότησης, η κατανόηση αυτής της ροής εργασίας θα σας δώσει τη δυνατότητα να παρέχετε εξατομικευμένες ειδοποιήσεις σε πραγματικό χρόνο. Ας ξεδιαλύνουμε την απλότητα του SSE και πώς μπορεί να βελτιώσει την εμπειρία χρήστη της εφαρμογής σας.

Εντολή Παράδειγμα χρήσης
@Sse Ένας διακοσμητής NestJS που χρησιμοποιείται για να ορίσει ένα τελικό σημείο συμβάντων από την πλευρά του διακομιστή (SSE). Για παράδειγμα, @Sse('κουπόνι-υπάλληλος') ρυθμίζει ένα τελικό σημείο για τη ροή ενημερώσεων σε πραγματικό χρόνο στον πελάτη.
fromEvent Μια συνάρτηση από το RxJS που μετατρέπει ένα συμβάν που εκπέμπεται από ένα EventEmitter σε ένα παρατηρήσιμο ρεύμα. Για παράδειγμα, fromEvent(this.eventEmitter, 'after-added-voucher') ακούει για ένα συγκεκριμένο γεγονός.
Observable Μια βασική ιδέα από το RxJS που χρησιμοποιείται για τη διαχείριση ασύγχρονων ροών δεδομένων. Είναι απαραίτητο για το χειρισμό συμβάντων από την πλευρά του διακομιστή στο NestJS, όπως π.χ Αισθητός<MessageEvent>.
@InjectQueue Ένας διακοσμητής NestJS που εισάγει ένα στιγμιότυπο ουράς, χρήσιμο για τη διαχείριση της επεξεργασίας εργασιών με βιβλιοθήκες όπως το Bull. Για παράδειγμα, @InjectQueue('allotVoucher') παρέχει πρόσβαση στην ουρά με το όνομα 'allotVoucher'.
WorkerHost Μια βασική κλάση από την BullMQ που επιτρέπει τον καθορισμό προσαρμοσμένων επεξεργαστών εργασιών στο NestJS. Για παράδειγμα, το AllotVoucherConsumer η τάξη επεκτείνεται WorkerHost να χειριστεί συγκεκριμένες δουλειές.
@OnWorkerEvent Ένας διακοσμητής συνήθιζε να ακούει συγκεκριμένα γεγονότα του κύκλου ζωής μιας εργασίας σε αναμονή. Για παράδειγμα, @OnWorkerEvent('ολοκληρώθηκε') χειρίζεται το «ολοκληρωμένο» γεγονός μιας εργασίας.
createMany Μια εντολή Prisma που χρησιμοποιείται για την εισαγωγή πολλαπλών εγγραφών σε μια βάση δεδομένων ταυτόχρονα. Για παράδειγμα, prisma.employeeVoucher.createMany προσθέτει όλα τα κουπόνια των εργαζομένων σε μία μόνο λειτουργία.
EventSource Ένα JavaScript API για τη λήψη συμβάντων που αποστέλλονται από τον διακομιστή (SSE) από το backend. Για παράδειγμα, new EventSource('http://localhost/vouchered-employee') δημιουργεί μια σύνδεση για ροή δεδομένων.
add Μια μέθοδος από τις ουρές Bull για να προσθέσετε μια νέα εργασία στην ουρά. Για παράδειγμα, allotVoucherQueue.add('allot-voucher', jobData) προγραμματίζει μια εργασία για επεξεργασία.
@OnEvent Ένας διακοσμητής NestJS που ακούει συγκεκριμένα συμβάντα που εκπέμπονται εντός της εφαρμογής. Για παράδειγμα, @OnEvent('after-allocate-voucher') ενεργοποιεί μια μέθοδο όταν εκπέμπεται αυτό το συμβάν.

Αποτελεσματικές ειδοποιήσεις με συμβάντα και ουρές από την πλευρά του διακομιστή

Τα σενάρια που παρέχονται απεικονίζουν ένα σύστημα όπου αποστέλλονται ειδοποιήσεις σε πραγματικό χρόνο στους υπαλλήλους μετά από μαζική εισαγωγή εγγραφών κουπονιών στη βάση δεδομένων. Η διαδικασία ξεκινά στο AllocateVoucherController, το οποίο εκθέτει ένα τελικό σημείο για τη δημιουργία εργασιών κατανομής κουπονιών. Όταν δημιουργείται μια εργασία, εκπέμπει ένα συμβάν με όνομα μετά την κατανομή-κουπόνι. Αυτό το συμβάν είναι απαραίτητο για την ενεργοποίηση των επόμενων βημάτων, διασφαλίζοντας ότι το σύστημα βασίζεται σε συμβάντα και αρθρωτή. Αυτός ο σχεδιασμός επιτρέπει τον σαφή διαχωρισμό των ανησυχιών, καθιστώντας το σύστημα πιο διατηρητέο ​​και επεκτάσιμο. 🎯

Στο επίπεδο υπηρεσιών, το AllocateVoucherService χειρίζεται τη λογική για τις εργασίες στην ουρά χρησιμοποιώντας το BullMQ. Μετά την παραλαβή του μετά την κατανομή-κουπόνι συμβάν, προσθέτει μια εργασία στην ουρά με το όνομα παραχωρώ-κουπόνι. Αυτή η ουρά επιτρέπει την ασύγχρονη επεξεργασία, διασφαλίζοντας ότι το σύστημα παραμένει αποκριτικό ακόμη και κατά την επεξεργασία μεγάλων συνόλων δεδομένων. Για παράδειγμα, εάν διαθέσετε κουπόνια σε 200 υπαλλήλους στο τμήμα πωλήσεων, η ουρά διασφαλίζει ότι η λειτουργία δεν αποκλείει άλλα αιτήματα. Η διαμόρφωση της ουράς περιλαμβάνει επιλογές όπως removeOnComplete για να διατηρήσετε τον Redis καθαρό μετά την ολοκλήρωση της εργασίας.

Οι εργασίες στην ουρά υποβάλλονται σε επεξεργασία από το AllotVoucherConsumer τάξη. Εδώ, εφαρμόζεται η λογική αναγνώρισης των σχετικών υπαλλήλων και εισαγωγής εγγραφών κουπονιών στη βάση δεδομένων. Η εντολή Prisma δημιουργήστε Πολλά χρησιμοποιείται για την ομαδική εισαγωγή εγγραφών στο Κουπόνι υπαλλήλου πίνακα, ο οποίος είναι βελτιστοποιημένος για απόδοση. Μετά την ολοκλήρωση της λειτουργίας της βάσης δεδομένων, εκπέμπεται ένα άλλο συμβάν για να ειδοποιηθούν οι συνδρομητές. Αυτό το συμβάν διασφαλίζει ότι οι εργαζόμενοι ειδοποιούνται μόνο μετά την επιτυχή επεξεργασία της μαζικής εισαγωγής, προσθέτοντας αξιοπιστία στο σύστημα ειδοποιήσεων. 🌟

Στο frontend, το στοιχείο React ακούει τα συμβάντα που αποστέλλονται από τον διακομιστή μέσω ενός Πηγή εκδήλωσης. Καθώς ειδοποιούνται οι εργαζόμενοι, τα στοιχεία τους ενημερώνονται δυναμικά στη διεπαφή χρήστη χωρίς να απαιτείται ανανέωση σελίδας. Αυτή η προσέγγιση παρέχει μια απρόσκοπτη εμπειρία χρήστη, παρόμοια με ενημερώσεις σε πραγματικό χρόνο που εμφανίζονται σε σύγχρονες διαδικτυακές εφαρμογές, όπως ζωντανά αποτελέσματα αθλητικών ή ειδοποιήσεις μέσων κοινωνικής δικτύωσης. Για παράδειγμα, οι εργαζόμενοι στο τμήμα HR δεν θα βλέπουν ενημερώσεις που προορίζονται για Πωλήσεις, καθώς το backend φιλτράρει με ακρίβεια τα συμβάντα με βάση τα κριτήρια κατανομής. Αυτή η ιδιαιτερότητα βελτιώνει τόσο την απόδοση όσο και τη συνάφεια, δημιουργώντας ένα σύστημα εστιασμένο στον χρήστη. 🖥️

Μαζική αποστολή ειδοποιήσεων με συμβάντα από την πλευρά του διακομιστή (SSE) στο NestJS

Αυτή η λύση επιδεικνύει μια προσέγγιση υποστήριξης για τη χρήση του NestJS με Prisma και Συμβάντα από την πλευρά του διακομιστή (SSE) για μαζικές λειτουργίες. Περιλαμβάνει μια αρχιτεκτονική που βασίζεται σε εκδηλώσεις και σύστημα ουράς.

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

Ενημερώσεις σε πραγματικό χρόνο για μαζικά ένθετα χρησιμοποιώντας NestJS και React

Αυτό το παράδειγμα διεπαφής χρησιμοποιεί το React για να ακούει συμβάντα από την πλευρά του διακομιστή και να ενημερώνει δυναμικά τη διεπαφή χρήστη κατά τη λήψη δεδομένων. Εξασφαλίζει ότι οι εργαζόμενοι ειδοποιούνται σε πραγματικό χρόνο μετά από μαζικές εισαγωγές.

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

Ειδοποιήσεις δοκιμής μονάδας για λειτουργίες μαζικής εισαγωγής

Αυτή η δοκιμή Jest διασφαλίζει ότι ο μηχανισμός εκπομπής συμβάντων και ειδοποίησης λειτουργεί σωστά στο backend για συμβάντα από την πλευρά του διακομιστή στο 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);
  });
});

Βελτίωση συστημάτων σε πραγματικό χρόνο με SSE στο NestJS

Ενώ έχουμε διερευνήσει την εφαρμογή των Συμβάντων από την πλευρά του διακομιστή (SSE) για την ειδοποίηση των εργαζομένων σχετικά με την κατανομή κουπονιών, υπάρχει μια ευρύτερη περίπτωση χρήσης για SSE σε συστήματα σε πραγματικό χρόνο. Το SSE λάμπει σε σενάρια όπου οι πελάτες πρέπει να ενημερώνονται με δεδομένα διακομιστή χωρίς διαρκή δημοσκόπηση. Για παράδειγμα, σκεφτείτε μια διαδικτυακή πλατφόρμα λιανικής που παρακολουθεί ζωντανές ενημερώσεις αποθέματος κατά τη διάρκεια μιας εκπτωτικής πώλησης. Χρησιμοποιώντας το SSE, μπορείτε να προωθήσετε αποτελεσματικά ενημερώσεις σε όλους τους συνδεδεμένους πελάτες, διασφαλίζοντας ότι βλέπουν τα πιο πρόσφατα επίπεδα αποθεμάτων χωρίς περιττό φορτίο διακομιστή. Αυτή η προσέγγιση εξασφαλίζει επεκτασιμότητα, ενώ διατηρεί την εμπειρία του χρήστη απρόσκοπτη. 🛒

Ενσωματώνοντας προηγμένα συστήματα ουράς όπως το BullMQ, όπως κάναμε με το παραχωρώ-κουπόνι ουρά, προσθέτει στιβαρότητα στις εργασίες μαζικής επεξεργασίας δεδομένων. Η ουρά διασφαλίζει ότι ακόμη και αν γίνει επανεκκίνηση διακομιστή, οι εργασίες που εκκρεμούν παραμένουν ανέπαφες και η επεξεργασία συνεχίζεται. Επιπλέον, οι μηχανισμοί επανάληψης δοκιμής μπορούν να διαμορφωθούν, διασφαλίζοντας ότι οι αποτυχημένες εργασίες (π.χ. λόγω προσωρινής διακοπής λειτουργίας της βάσης δεδομένων) θα ξαναδοκιμάζονται αυτόματα. Για παράδειγμα, εάν μια κατανομή σε 300 υπαλλήλους σε όλα τα τμήματα αντιμετωπίσει ένα προσωρινό σφάλμα, η ανθεκτικότητα της ουράς διασφαλίζει ότι δεν θα μείνουν μη επεξεργασμένες εγγραφές, προσθέτοντας αξιοπιστία στο σύστημά σας.

Πέρα από τις ειδοποιήσεις σε πραγματικό χρόνο, το SSE μπορεί επίσης να συμπληρώσει τις υπηρεσίες email για εργασίες που απαιτούν λεπτομερείς περιλήψεις. Αφού αποσταλούν όλες οι ειδοποιήσεις κουπονιών μέσω SSE, το backend μπορεί να δημιουργήσει ασύγχρονα μια αναφορά και να στείλει ένα συγκεντρωτικό email στους διαχειριστές. Αυτή η επικοινωνία πολλαπλών καναλιών εξασφαλίζει τόσο άμεσες ειδοποιήσεις όσο και ολοκληρωμένη παρακολούθηση, καλύπτοντας ένα ευρύ φάσμα προτιμήσεων των χρηστών. Μια τέτοια ενοποίηση ενισχύει την ευελιξία του συστήματός σας, δημιουργώντας μια ολοκληρωμένη εμπειρία χρήστη. 📧

Συχνές ερωτήσεις σχετικά με το SSE στο NestJS

  1. Ποια είναι τα οφέλη από τη χρήση συμβάντων από την πλευρά του διακομιστή μέσω WebSockets;
  2. Το SSE είναι πιο απλό στην εφαρμογή και χρησιμοποιεί HTTP, καθιστώντας το φιλικό προς το τείχος προστασίας. Σε αντίθεση με τα WebSockets, απαιτεί μόνο μία μονοκατευθυντική σύνδεση, η οποία είναι αποτελεσματική για ενημερώσεις σε πραγματικό χρόνο.
  3. Μπορώ να χρησιμοποιήσω @Sse με πολλαπλά τελικά σημεία σε έναν ελεγκτή;
  4. Ναι, μπορείτε να ορίσετε πολλά @Sse τελικά σημεία στον ίδιο ελεγκτή για την εξυπηρέτηση διαφορετικών ροών δεδομένων σε πελάτες με βάση συγκεκριμένες ανάγκες.
  5. Πώς χειρίζομαι τα σφάλματα κατά την επεξεργασία της ουράς;
  6. Με το BullMQ, μπορείτε να ορίσετε επιλογές επανάληψης και να χρησιμοποιήσετε προγράμματα ακρόασης συμβάντων όπως @OnWorkerEvent('failed') για την καταγραφή σφαλμάτων και την επανεπεξεργασία εργασιών εάν είναι απαραίτητο.
  7. Το Prisma's createMany υποστήριξη μεθόδου επαναλήψεις συναλλαγών;
  8. Ναι, του Prisma createMany μπορεί να τυλιχτεί σε μια συναλλαγή. Εάν οποιαδήποτε λειτουργία στη συναλλαγή αποτύχει, όλες οι λειτουργίες επαναφέρονται για συνέπεια.
  9. Τι συμβαίνει εάν ο πελάτης αποσυνδεθεί κατά τη διάρκεια μιας ροής SSE;
  10. Ο διακομιστής σταματά να στέλνει ενημερώσεις μόλις εντοπίσει την αποσύνδεση. Μπορείτε να εφαρμόσετε τη λογική επανασύνδεσης στον πελάτη χρησιμοποιώντας το EventSource API.
  11. Μπορεί το SSE να χρησιμοποιηθεί για αμφίδρομη επικοινωνία;
  12. Όχι, το SSE είναι μονής κατεύθυνσης (διακομιστής σε πελάτη). Για αμφίδρομη επικοινωνία, χρησιμοποιήστε ροές WebSockets ή HTTP2.
  13. Πώς μπορώ να εξασφαλίσω τα τελικά σημεία SSE στο NestJS;
  14. Χρησιμοποιήστε προστατευτικά ή ενδιάμεσα προϊόντα, όπως @UseGuards, για την επιβολή ελέγχου ταυτότητας και εξουσιοδότησης για τα τελικά σημεία SSE σας.
  15. Μπορεί το SSE να συνεργαστεί με πελάτες που δεν έχουν προγράμματα περιήγησης;
  16. Ναι, κάθε πελάτης που υποστηρίζει HTTP και ροή συμβάντων (π.χ. Node.js, cURL) μπορεί να καταναλώσει ροές SSE.
  17. Ποιος είναι ο μέγιστος αριθμός πελατών που μπορούν να συνδεθούν σε ένα τελικό σημείο SSE;
  18. Αυτό εξαρτάται από τη διαμόρφωση και τα όρια πόρων του διακομιστή σας. Η εξισορρόπηση φορτίου και η ομαδοποίηση μπορούν να βοηθήσουν την κλίμακα για την υποστήριξη περισσότερων πελατών.
  19. Είναι δυνατή η αποστολή δεδομένων JSON μέσω SSE;
  20. Ναι, μπορείτε να σειριοποιήσετε αντικείμενα σε συμβολοσειρές JSON και να τα στείλετε χρησιμοποιώντας new MessageEvent στο NestJS.

Αποτελεσματικές ειδοποιήσεις σε πραγματικό χρόνο στο NestJS

Εφαρμογή συστημάτων σε πραγματικό χρόνο χρησιμοποιώντας SSE στο NestJS απλοποιεί την επικοινωνία μεταξύ διακομιστή και πελατών. Αυτή η μέθοδος μειώνει το φόρτο του διακομιστή σε σύγκριση με τη συνεχή δημοσκόπηση και επιτρέπει την ακριβή στόχευση για ειδοποιήσεις. Για παράδειγμα, ένα εργαλείο ανθρώπινου δυναμικού μπορεί να ειδοποιήσει 200 ​​υπαλλήλους στις Πωλήσεις για νέα κουπόνια χωρίς να ενοχλεί άλλους. 🎯

Με εργαλεία όπως το BullMQ και το Prisma, αυτή η ρύθμιση εξασφαλίζει ασύγχρονη επεξεργασία εργασιών και αποτελεσματικές λειτουργίες βάσης δεδομένων. Η ευελιξία της αρχιτεκτονικής που βασίζεται σε συμβάντα την καθιστά μια επεκτάσιμη λύση για διάφορες απαιτήσεις σε πραγματικό χρόνο, ενισχύοντας την αφοσίωση των χρηστών και την αξιοπιστία του συστήματος.

Πηγές και Αναφορές
  1. Αναλυτική τεκμηρίωση για NestJS Framework για τη δημιουργία επεκτάσιμων εφαρμογών από την πλευρά του διακομιστή.
  2. Οδηγός χρήσης BullMQ για ισχυρή διαχείριση ουράς εργασιών σε εφαρμογές Node.js.
  3. Επίσημος ανώτερος υπάλληλος Τεκμηρίωση Prisma για λειτουργίες βάσης δεδομένων και χρήση ORM.
  4. Πληροφορίες για Συμβάντα απεσταλμένα από διακομιστή (SSE) για επικοινωνία πελάτη-διακομιστή σε πραγματικό χρόνο.
  5. Πρακτικά παραδείγματα υλοποίησης frontend από το Τεκμηρίωση ReactJS για τη δημιουργία διαδραστικών διεπαφών χρήστη.