Notifikasi yang Mudah di NestJS Menggunakan Peristiwa Sisi Server untuk Operasi Massal

Temp mail SuperHeros
Notifikasi yang Mudah di NestJS Menggunakan Peristiwa Sisi Server untuk Operasi Massal
Notifikasi yang Mudah di NestJS Menggunakan Peristiwa Sisi Server untuk Operasi Massal

Pengiriman Pemberitahuan yang Efisien untuk Operasi Penyisipan Massal

Bayangkan Anda mengelola sistem di mana ratusan karyawan diberikan voucher berdasarkan berbagai kriteria seperti departemen, tingkatan, atau pengalaman. Merupakan tugas besar untuk memberi tahu setiap karyawan secara efisien tanpa menyebabkan kemacetan dalam sistem. 🔔 Tantangan ini menjadi lebih berat ketika Anda ingin menghindari kerumitan soket atau mekanisme pemungutan suara.

Dalam skenario seperti itu, Server-Side Events (SSE) muncul sebagai solusi yang kuat namun mudah. Dengan memanfaatkan SSE di aplikasi NestJS, Anda dapat membuat saluran komunikasi real-time untuk memberi tahu kelompok karyawan tertentu berdasarkan kriteria dinamis. Misalnya, ketika voucher dialokasikan ke departemen Penjualan, hanya karyawan tersebut yang akan menerima pemberitahuan, sehingga memastikan pembaruan yang tepat dan bermakna.

Melalui artikel ini, kita akan mendalami contoh praktis yang menunjukkan cara mengintegrasikan SSE ke dalam proses penyisipan massal menggunakan NestJS. Kami akan menjalani siklus hidup, mulai dari memicu peristiwa di backend hingga mendengarkan pembaruan di frontend, semuanya sambil mempertahankan kinerja yang lancar. đŸ’Œ

Baik Anda sedang mengembangkan alat SDM atau aplikasi keuangan, memahami alur kerja ini akan memberdayakan Anda untuk mengirimkan notifikasi yang dipersonalisasi secara real-time. Mari kita uraikan kesederhanaan SSE dan bagaimana SSE dapat meningkatkan pengalaman pengguna aplikasi Anda.

Memerintah Contoh Penggunaan
@Sse Dekorator NestJS yang digunakan untuk menentukan titik akhir Peristiwa Sisi Server (SSE). Misalnya, @Sse('karyawan yang diberi voucher') menyiapkan titik akhir untuk mengalirkan pembaruan waktu nyata ke klien.
fromEvent Fungsi dari RxJS yang mengubah peristiwa yang dipancarkan oleh AcaraEmitter menjadi aliran yang dapat diamati. Misalnya, fromEvent(this.eventEmitter, 'voucher setelah ditambahkan') mendengarkan acara tertentu.
Observable Konsep inti dari RxJS yang digunakan untuk mengelola aliran data asinkron. Ini penting untuk menangani Peristiwa Sisi Server di NestJS, seperti Tampak<MessageEvent>.
@InjectQueue Dekorator NestJS yang memasukkan instance antrian, berguna untuk mengelola pemrosesan pekerjaan dengan perpustakaan seperti Bull. Misalnya, @InjectQueue('allotVoucher') menyediakan akses ke antrian bernama 'allotVoucher'.
WorkerHost Kelas dasar dari BullMQ yang memungkinkan penentuan pemroses tugas khusus di NestJS. Misalnya, BagikanVoucherConsumer kelas meluas PekerjaHost untuk menangani pekerjaan tertentu.
@OnWorkerEvent Dekorator yang digunakan untuk mendengarkan peristiwa siklus hidup tertentu dari pekerjaan antrian. Misalnya, @OnWorkerEvent('selesai') menangani peristiwa "selesai" dari suatu pekerjaan.
createMany Perintah Prisma yang digunakan untuk memasukkan beberapa record ke dalam database sekaligus. Misalnya, prisma.Voucher Karyawan.createMany menambahkan voucher semua karyawan dalam satu operasi.
EventSource API JavaScript untuk menerima peristiwa yang dikirim server (SSE) dari backend. Misalnya, EventSource baru('http://localhost/voucher-employee') membuat koneksi untuk streaming data.
add Sebuah metode dari antrian Bull untuk menambahkan pekerjaan baru ke antrian. Misalnya, allotVoucherQueue.add('jatah-voucher', data pekerjaan) menjadwalkan pekerjaan untuk diproses.
@OnEvent Dekorator NestJS yang mendengarkan peristiwa tertentu yang dipancarkan dalam aplikasi. Misalnya, @OnEvent('setelah-alokasi-voucher') memicu metode ketika peristiwa ini dipancarkan.

Pemberitahuan Efisien dengan Peristiwa dan Antrean Sisi Server

Skrip yang disediakan menggambarkan sistem di mana pemberitahuan real-time dikirim ke karyawan setelah catatan voucher dimasukkan secara massal ke dalam database. Prosesnya dimulai di AlokasikanVoucherController, yang memperlihatkan titik akhir untuk membuat tugas alokasi voucher. Saat tugas dibuat, tugas tersebut memunculkan peristiwa bernama setelah-alokasi-voucher. Peristiwa ini penting untuk memicu langkah-langkah berikutnya, memastikan bahwa sistem ini berbasis peristiwa dan bersifat modular. Desain ini memungkinkan pemisahan masalah yang jelas, sehingga membuat sistem lebih mudah dikelola dan ditingkatkan skalanya. 🎯

Di lapisan layanan, AlokasikanVoucherService menangani logika untuk mengantri tugas menggunakan BullMQ. Setelah menerima setelah-alokasi-voucher acara, itu menambahkan pekerjaan ke antrian bernama membagikan voucher. Antrean ini memungkinkan pemrosesan asinkron, memastikan sistem tetap responsif bahkan saat memproses kumpulan data besar. Misalnya, jika Anda mengalokasikan voucher ke 200 karyawan di departemen Penjualan, antrian memastikan bahwa operasi tidak memblokir permintaan lainnya. Konfigurasi antrian mencakup opsi seperti hapusOnComplete untuk menjaga Redis tetap bersih setelah pekerjaan selesai.

Pekerjaan antrian diproses oleh BagikanVoucherConsumer kelas. Di sini, logika untuk mengidentifikasi karyawan yang relevan dan memasukkan catatan voucher ke dalam database diterapkan. Perintah Prisma buatBanyak digunakan untuk memasukkan catatan secara batch ke dalam voucher karyawan tabel, yang dioptimalkan untuk kinerja. Setelah operasi database selesai, peristiwa lain dikeluarkan untuk memberi tahu pelanggan. Peristiwa ini memastikan bahwa karyawan hanya diberi tahu setelah penyisipan massal berhasil diproses, sehingga menambah keandalan sistem pemberitahuan. 🌟

Di frontend, komponen React mendengarkan event yang dikirim server melalui Sumber Acara. Saat karyawan diberi tahu, detail mereka diperbarui secara dinamis di UI tanpa memerlukan penyegaran halaman. Pendekatan ini memberikan pengalaman pengguna yang lancar, serupa dengan pembaruan real-time yang terlihat di aplikasi web modern seperti skor olahraga langsung atau notifikasi media sosial. Misalnya, karyawan di departemen SDM tidak akan melihat pembaruan yang ditujukan untuk Penjualan, karena backend secara tepat memfilter peristiwa berdasarkan kriteria alokasi. Kekhususan ini meningkatkan kinerja dan relevansi, menciptakan sistem yang berfokus pada pengguna. đŸ–„ïž

Mengirim Pemberitahuan Secara Massal dengan Server-Side Events (SSE) di NestJS

Solusi ini menunjukkan pendekatan backend dalam menggunakan NestJS dengan Prisma dan Server-Side Events (SSE) untuk operasi massal. Ini mencakup arsitektur berbasis peristiwa dan sistem antrian.

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

Pembaruan Real-Time untuk Penyisipan Massal Menggunakan NestJS dan React

Contoh frontend ini menggunakan React untuk mendengarkan Peristiwa Sisi Server dan memperbarui UI secara dinamis saat data diterima. Ini memastikan karyawan mendapat pemberitahuan secara real-time setelah penyisipan massal.

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

Pemberitahuan Pengujian Unit untuk Operasi Penyisipan Massal

Tes Jest ini memastikan emisi peristiwa dan mekanisme pemberitahuan berfungsi dengan benar di backend untuk Peristiwa Sisi Server di 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);
  });
});

Meningkatkan Sistem Real-Time dengan SSE di NestJS

Meskipun kami telah mengeksplorasi penerapan Server-Side Events (SSE) untuk memberi tahu karyawan tentang alokasi voucher, ada kasus penggunaan SSE yang lebih luas dalam sistem real-time. SSE unggul dalam skenario di mana klien perlu terus memperbarui data server tanpa terus-menerus melakukan polling. Misalnya, pikirkan tentang platform ritel online yang melacak pembaruan inventaris langsung selama penjualan kilat. Dengan menggunakan SSE, Anda dapat secara efisien mengirimkan pembaruan ke semua klien yang terhubung, memastikan mereka melihat tingkat stok terbaru tanpa beban server yang tidak perlu. Pendekatan ini memastikan skalabilitas sekaligus menjaga pengalaman pengguna tetap lancar. 🛒

Menggabungkan sistem antrian canggih seperti BullMQ, seperti yang kami lakukan dengan membagikan voucher antrian, menambah ketahanan pada tugas pemrosesan data massal. Antrian memastikan bahwa meskipun terjadi restart server, tugas yang tertunda tetap utuh, dan pemrosesan dilanjutkan. Selain itu, mekanisme percobaan ulang dapat dikonfigurasi, memastikan pekerjaan yang gagal (misalnya karena downtime database sementara) dicoba ulang secara otomatis. Misalnya, jika alokasi untuk 300 karyawan di seluruh departemen mengalami kesalahan sementara, ketahanan antrean memastikan tidak ada catatan yang tidak diproses, sehingga menambah keandalan sistem Anda.

Selain notifikasi real-time, SSE juga dapat melengkapi layanan email untuk tugas-tugas yang memerlukan ringkasan terperinci. Setelah semua pemberitahuan voucher dikirim melalui SSE, backend dapat membuat laporan secara asinkron dan mengirim email gabungan ke manajer. Komunikasi multi-saluran ini memastikan pemberitahuan langsung dan tindak lanjut komprehensif, yang memenuhi berbagai preferensi pengguna. Integrasi tersebut meningkatkan fleksibilitas sistem Anda, menciptakan pengalaman pengguna yang menyeluruh. 📧

Pertanyaan Umum Tentang SSE di NestJS

  1. Apa manfaat menggunakan Peristiwa Sisi Server dibandingkan WebSockets?
  2. SSE lebih sederhana untuk diimplementasikan dan menggunakan HTTP, sehingga ramah terhadap firewall. Tidak seperti WebSockets, ini hanya memerlukan satu koneksi searah, yang efisien untuk pembaruan waktu nyata.
  3. Bisakah saya menggunakan @Sse dengan beberapa titik akhir di pengontrol?
  4. Ya, Anda dapat mendefinisikan banyak @Sse titik akhir di pengontrol yang sama untuk menyajikan aliran data yang berbeda ke klien berdasarkan kebutuhan spesifik.
  5. Bagaimana cara menangani kesalahan selama pemrosesan antrian?
  6. Dengan BullMQ, Anda dapat menentukan opsi percobaan ulang dan menggunakan pendengar acara seperti @OnWorkerEvent('failed') untuk mencatat kesalahan dan memproses ulang pekerjaan jika perlu.
  7. Apakah Prisma createMany metode mendukung pengembalian transaksi?
  8. Ya, milik Prisma createMany dapat dibungkus dalam suatu transaksi. Jika ada operasi dalam transaksi yang gagal, semua operasi dibatalkan untuk konsistensi.
  9. Apa yang terjadi jika klien terputus selama aliran SSE?
  10. Server berhenti mengirimkan pembaruan setelah mendeteksi pemutusan sambungan. Anda dapat menerapkan logika koneksi ulang pada klien menggunakan EventSource API.
  11. Bisakah SSE digunakan untuk komunikasi dua arah?
  12. Tidak, SSE bersifat searah (server-ke-klien). Untuk komunikasi dua arah, gunakan aliran WebSockets atau HTTP2.
  13. Bagaimana cara mengamankan titik akhir SSE di NestJS?
  14. Gunakan penjaga atau middleware, seperti @UseGuards, untuk menerapkan autentikasi dan otorisasi untuk titik akhir SSE Anda.
  15. Bisakah SSE bekerja dengan klien non-browser?
  16. Ya, klien mana pun yang mendukung HTTP dan streaming peristiwa (mis., Node.js, cURL) dapat menggunakan aliran SSE.
  17. Berapa jumlah maksimum klien yang dapat terhubung ke titik akhir SSE?
  18. Hal ini bergantung pada konfigurasi server Anda dan batasan sumber daya. Penyeimbangan beban dan pengelompokan dapat membantu meningkatkan skala untuk mendukung lebih banyak klien.
  19. Apakah mungkin mengirim data JSON melalui SSE?
  20. Ya, Anda dapat membuat serial objek ke string JSON dan mengirimkannya menggunakan new MessageEvent di NestJS.

Notifikasi Real-Time yang Efektif di NestJS

Menerapkan sistem real-time menggunakan SSE di NestJS menyederhanakan komunikasi antara server dan klien. Metode ini mengurangi beban server dibandingkan dengan polling konstan dan memungkinkan penargetan notifikasi yang tepat. Misalnya, alat HR dapat memberi tahu 200 karyawan di bagian Penjualan tentang voucher baru tanpa mengganggu orang lain. 🎯

Dengan alat seperti BullMQ dan Prisma, pengaturan ini memastikan pemrosesan tugas yang tidak sinkron dan operasi database yang efisien. Fleksibilitas arsitektur berbasis peristiwa menjadikannya solusi terukur untuk berbagai kebutuhan real-time, meningkatkan keterlibatan pengguna dan keandalan sistem.

Sumber dan Referensi
  1. Dokumentasi terperinci tentang Kerangka NestJS untuk membangun aplikasi sisi server yang skalabel.
  2. Panduan penggunaan BantengMQ untuk manajemen antrean pekerjaan yang tangguh di aplikasi Node.js.
  3. Resmi Dokumentasi Prisma untuk operasi database dan penggunaan ORM.
  4. Wawasan tentang Peristiwa Terkirim Server (SSE) untuk komunikasi klien-server secara real-time.
  5. Contoh implementasi frontend praktis dari Dokumentasi ReactJS untuk membangun antarmuka pengguna yang interaktif.