$lang['tuto'] = "tutorial"; ?> Pemberitahuan Mudah dalam NestJS Menggunakan Acara Sisi

Pemberitahuan Mudah dalam NestJS Menggunakan Acara Sisi Pelayan untuk Operasi Pukal

Temp mail SuperHeros
Pemberitahuan Mudah dalam NestJS Menggunakan Acara Sisi Pelayan untuk Operasi Pukal
Pemberitahuan Mudah dalam NestJS Menggunakan Acara Sisi Pelayan untuk Operasi Pukal

Penghantaran Pemberitahuan Diperkemas untuk Operasi Sisipan Pukal

Bayangkan anda menguruskan sistem di mana ratusan pekerja diberikan baucar berdasarkan pelbagai kriteria seperti jabatan, gred atau pengalaman. Adalah tugas yang besar untuk memberitahu setiap pekerja dengan cekap tanpa menyebabkan kesesakan dalam sistem. 🔔 Cabaran ini menjadi lebih menakutkan apabila anda bertujuan untuk mengelakkan kerumitan soket atau mekanisme pengundian.

Dalam senario sedemikian, Peristiwa Sisi Pelayan (SSE) muncul sebagai penyelesaian yang berkuasa namun mudah. Dengan memanfaatkan SSE dalam aplikasi NestJS anda, anda boleh mewujudkan saluran komunikasi masa nyata untuk memberitahu kumpulan pekerja tertentu berdasarkan kriteria dinamik. Sebagai contoh, apabila baucar diperuntukkan kepada jabatan Jualan, hanya pekerja tersebut harus menerima pemberitahuan, memastikan kemas kini yang tepat dan bermakna.

Melalui artikel ini, kami akan menyelami contoh praktikal yang menunjukkan cara menyepadukan SSE ke dalam proses sisipan pukal menggunakan NestJS. Kami akan melalui kitaran hayat, daripada mencetuskan peristiwa di bahagian belakang hingga mendengar kemas kini pada bahagian hadapan, semuanya sambil mengekalkan prestasi yang lancar. đŸ’Œ

Sama ada anda sedang membangunkan alat HR atau apl kewangan, memahami aliran kerja ini akan memperkasakan anda untuk menyampaikan pemberitahuan diperibadikan dalam masa nyata. Mari kita bongkarkan kesederhanaan SSE dan cara ia boleh meningkatkan pengalaman pengguna aplikasi anda.

Perintah Contoh Penggunaan
@Sse Penghias NestJS digunakan untuk menentukan titik akhir Peristiwa Sisi Pelayan (SSE). Sebagai contoh, @Sse('pekerja-baucar') menyediakan titik akhir untuk menstrim kemas kini masa nyata kepada pelanggan.
fromEvent Fungsi daripada RxJS yang menukar peristiwa yang dipancarkan oleh Pemancar Acara ke dalam aliran yang boleh diperhatikan. Sebagai contoh, fromEvent(this.eventEmitter, 'selepas-tambah-baucar') mendengar acara tertentu.
Observable Konsep teras daripada RxJS digunakan untuk mengurus aliran data tak segerak. Ia adalah penting untuk mengendalikan Peristiwa Sisi Pelayan dalam NestJS, seperti Boleh diperhatikan<MessageEvent>.
@InjectQueue Penghias NestJS yang menyuntik contoh baris gilir, berguna untuk mengurus pemprosesan kerja dengan perpustakaan seperti Bull. Sebagai contoh, @InjectQueue('allotVoucher') menyediakan akses kepada baris gilir bernama 'allotVoucher'.
WorkerHost Kelas asas daripada BullMQ yang membenarkan penentuan pemproses kerja tersuai dalam NestJS. Sebagai contoh, yang AllotBaucarPengguna kelas dilanjutkan WorkerHost untuk mengendalikan pekerjaan tertentu.
@OnWorkerEvent Seorang penghias digunakan untuk mendengar peristiwa kitaran hayat tertentu bagi kerja baris gilir. Sebagai contoh, @OnWorkerEvent('selesai') mengendalikan acara "selesai" sesuatu kerja.
createMany Perintah Prisma digunakan untuk memasukkan berbilang rekod ke dalam pangkalan data sekaligus. Sebagai contoh, prisma.employeeVoucher.createMany menambah baucar semua pekerja dalam satu operasi.
EventSource API JavaScript untuk menerima acara dihantar pelayan (SSE) dari bahagian belakang. Sebagai contoh, EventSource baharu('http://localhost/vouchered-employee') mewujudkan sambungan untuk penstriman data.
add Kaedah daripada baris gilir Bull untuk menambah kerja baharu pada baris gilir. Sebagai contoh, allotVoucherQueue.add('allot-baucar', jobData) menjadualkan kerja untuk diproses.
@OnEvent Penghias NestJS yang mendengar acara tertentu yang dipancarkan dalam aplikasi. Sebagai contoh, @OnEvent('selepas-peruntukkan-baucar') mencetuskan kaedah apabila peristiwa ini dipancarkan.

Pemberitahuan Cekap dengan Acara Sebelah Pelayan dan Baris Gilir

Skrip yang disediakan menggambarkan sistem di mana pemberitahuan masa nyata dihantar kepada pekerja selepas pemasukan pukal rekod baucar ke dalam pangkalan data. Proses bermula dalam AllocateVoucherController, yang mendedahkan titik akhir untuk membuat tugas peruntukan baucar. Apabila tugasan dibuat, ia mengeluarkan acara bernama selepas-peruntukkan-baucar. Peristiwa ini penting untuk mencetuskan langkah seterusnya, memastikan bahawa sistem dipacu peristiwa dan modular. Reka bentuk ini membolehkan pemisahan kebimbangan yang jelas, menjadikan sistem lebih boleh diselenggara dan berskala. 🎯

Dalam lapisan perkhidmatan, yang AllocateVoucherService mengendalikan logik untuk tugasan beratur menggunakan BullMQ. Selepas menerima selepas-peruntukkan-baucar acara, ia menambah kerja pada baris gilir yang dinamakan peruntukkan-baucar. Barisan gilir ini membenarkan pemprosesan tak segerak, memastikan sistem kekal responsif walaupun semasa memproses set data yang besar. Sebagai contoh, jika anda memperuntukkan baucar kepada 200 pekerja di bahagian Jualan, baris gilir memastikan bahawa operasi tidak menyekat permintaan lain. Konfigurasi baris gilir termasuk pilihan seperti removeOnComplete untuk memastikan Redis bersih selepas kerja selesai.

Kerja beratur diproses oleh AllotBaucarPengguna kelas. Di sini, logik untuk mengenal pasti pekerja yang berkaitan dan memasukkan rekod baucar ke dalam pangkalan data dilaksanakan. Perintah Prisma createMany digunakan untuk memasukkan rekod ke dalam kumpulan Baucar pekerja jadual, yang dioptimumkan untuk prestasi. Selepas operasi pangkalan data selesai, acara lain dipancarkan untuk memberitahu pelanggan. Acara ini memastikan bahawa pekerja hanya dimaklumkan selepas sisipan pukal berjaya diproses, menambah kebolehpercayaan pada sistem pemberitahuan. 🌟

Pada bahagian hadapan, komponen React mendengar peristiwa yang dihantar pelayan melalui Sumber Acara. Apabila pekerja dimaklumkan, butiran mereka dikemas kini secara dinamik dalam UI tanpa memerlukan muat semula halaman. Pendekatan ini memberikan pengalaman pengguna yang lancar, serupa dengan kemas kini masa nyata yang dilihat dalam aplikasi web moden seperti skor sukan secara langsung atau pemberitahuan media sosial. Contohnya, pekerja di jabatan HR tidak akan melihat kemas kini yang bertujuan untuk Jualan, kerana bahagian belakang menapis acara dengan tepat berdasarkan kriteria peruntukan. Kekhususan ini meningkatkan kedua-dua prestasi dan perkaitan, mewujudkan sistem yang memfokuskan pengguna. đŸ–„ïž

Menghantar Pemberitahuan secara Pukal dengan Acara Sisi Pelayan (SSE) dalam NestJS

Penyelesaian ini menunjukkan pendekatan bahagian belakang untuk menggunakan NestJS dengan Prisma dan Acara Sisi Pelayan (SSE) untuk operasi pukal. Ia termasuk seni bina dipacu acara dan sistem baris gilir.

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

Kemas Kini Masa Nyata untuk Sisipan Pukal Menggunakan NestJS dan React

Contoh bahagian hadapan ini menggunakan React untuk mendengar Peristiwa Sisi Pelayan dan mengemas kini UI secara dinamik apabila data diterima. Ia memastikan pekerja mendapat pemberitahuan dalam masa nyata selepas sisipan pukal.

// 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 Sisipan Pukal

Ujian Jest ini memastikan pelepasan peristiwa dan mekanisme pemberitahuan berfungsi dengan betul di bahagian belakang untuk Peristiwa Sisi Pelayan dalam 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);
  });
});

Mempertingkatkan Sistem Masa Nyata dengan SSE dalam NestJS

Walaupun kami telah meneroka pelaksanaan Peristiwa Sisi Pelayan (SSE) untuk memberitahu pekerja tentang peruntukan baucar, terdapat kes penggunaan yang lebih luas untuk SSE dalam sistem masa nyata. SSE bersinar dalam senario di mana pelanggan perlu sentiasa dikemas kini dengan data pelayan tanpa mengundi secara berterusan. Contohnya, fikirkan tentang platform runcit dalam talian yang menjejak kemas kini inventori langsung semasa jualan kilat. Menggunakan SSE, anda boleh menolak kemas kini dengan cekap kepada semua pelanggan yang disambungkan, memastikan mereka melihat tahap stok terkini tanpa beban pelayan yang tidak perlu. Pendekatan ini memastikan kebolehskalaan sambil memastikan pengalaman pengguna lancar. 🛒

Menggabungkan sistem baris gilir lanjutan seperti BullMQ, seperti yang kami lakukan dengan peruntukkan-baucar baris gilir, menambah keteguhan kepada tugas pemprosesan data pukal. Barisan gilir memastikan bahawa walaupun permulaan semula pelayan berlaku, tugas yang belum selesai kekal utuh dan pemprosesan disambung semula. Selain itu, mekanisme cuba semula boleh dikonfigurasikan, memastikan kerja yang gagal (cth., disebabkan masa henti pangkalan data sementara) dicuba semula secara automatik. Sebagai contoh, jika peruntukan kepada 300 pekerja merentas jabatan mengalami ralat sementara, daya tahan baris gilir memastikan tiada rekod tidak diproses, menambah kebolehpercayaan pada sistem anda.

Di luar pemberitahuan masa nyata, SSE juga boleh melengkapkan perkhidmatan e-mel untuk tugasan yang memerlukan ringkasan terperinci. Selepas semua pemberitahuan baucar dihantar melalui SSE, bahagian belakang boleh menjana laporan secara tidak segerak dan menghantar e-mel yang disatukan kepada pengurus. Komunikasi berbilang saluran ini memastikan kedua-dua pemberitahuan segera dan susulan menyeluruh, memenuhi pelbagai pilihan pengguna. Penyepaduan sedemikian meningkatkan fleksibiliti sistem anda, mewujudkan pengalaman pengguna yang lengkap. 📧

Soalan Lazim Mengenai SSE dalam NestJS

  1. Apakah faedah menggunakan Peristiwa Sisi Pelayan berbanding WebSockets?
  2. SSE lebih mudah untuk dilaksanakan dan menggunakan HTTP, menjadikannya mesra tembok api. Tidak seperti WebSockets, ia hanya memerlukan satu sambungan satu arah, yang cekap untuk kemas kini masa nyata.
  3. Boleh saya guna @Sse dengan berbilang titik akhir dalam pengawal?
  4. Ya, anda boleh menentukan berbilang @Sse titik akhir dalam pengawal yang sama untuk menyampaikan aliran data yang berbeza kepada pelanggan berdasarkan keperluan khusus.
  5. Bagaimanakah saya mengendalikan ralat semasa pemprosesan baris gilir?
  6. Dengan BullMQ, anda boleh menentukan pilihan cuba semula dan menggunakan pendengar acara seperti @OnWorkerEvent('failed') untuk log ralat dan memproses semula kerja jika perlu.
  7. Adakah Prisma's createMany kaedah sokongan balik urus niaga?
  8. Ya, Prisma createMany boleh dibungkus dalam transaksi. Jika mana-mana operasi dalam urus niaga gagal, semua operasi akan ditarik balik untuk konsistensi.
  9. Apakah yang berlaku jika pelanggan memutuskan sambungan semasa aliran SSE?
  10. Pelayan berhenti menghantar kemas kini sebaik sahaja ia mengesan pemutusan sambungan. Anda boleh melaksanakan logik sambungan semula pada klien menggunakan EventSource API.
  11. Bolehkah SSE digunakan untuk komunikasi dua hala?
  12. Tidak, SSE adalah satu arah (pelayan-ke-klien). Untuk komunikasi dua hala, gunakan strim WebSockets atau HTTP2.
  13. Bagaimanakah cara saya melindungi titik akhir SSE dalam NestJS?
  14. Gunakan pengawal atau perisian tengah, seperti @UseGuards, untuk menguatkuasakan pengesahan dan kebenaran untuk titik akhir SSE anda.
  15. Bolehkah SSE berfungsi dengan pelanggan bukan penyemak imbas?
  16. Ya, mana-mana pelanggan yang menyokong HTTP dan penstriman acara (cth., Node.js, cURL) boleh menggunakan strim SSE.
  17. Berapakah bilangan maksimum pelanggan yang boleh menyambung ke titik akhir SSE?
  18. Ini bergantung pada konfigurasi pelayan anda dan had sumber. Pengimbangan beban dan pengelompokan boleh membantu skala untuk menyokong lebih ramai pelanggan.
  19. Adakah mungkin untuk menghantar data JSON melalui SSE?
  20. Ya, anda boleh menyerikan objek kepada rentetan JSON dan menghantarnya menggunakan new MessageEvent dalam NestJS.

Pemberitahuan Masa Nyata Berkesan dalam NestJS

Melaksanakan sistem masa nyata menggunakan SSE dalam NestJS memudahkan komunikasi antara pelayan dan pelanggan. Kaedah ini mengurangkan beban pelayan berbanding pengundian berterusan dan membolehkan penyasaran tepat untuk pemberitahuan. Sebagai contoh, alat HR boleh memberitahu 200 pekerja dalam Jualan tentang baucar baharu tanpa mengganggu orang lain. 🎯

Dengan alatan seperti BullMQ dan Prisma, persediaan ini memastikan pemprosesan tugas tak segerak dan operasi pangkalan data yang cekap. Fleksibiliti seni bina berasaskan acara menjadikannya penyelesaian berskala untuk pelbagai keperluan masa nyata, meningkatkan penglibatan pengguna dan kebolehpercayaan sistem.

Sumber dan Rujukan
  1. Dokumentasi terperinci mengenai Rangka Kerja NestJS untuk membina aplikasi sisi pelayan berskala.
  2. Panduan menggunakan BullMQ untuk pengurusan baris gilir kerja yang mantap dalam aplikasi Node.js.
  3. rasmi Dokumentasi Prisma untuk operasi pangkalan data dan penggunaan ORM.
  4. Cerapan pada Acara Dihantar Pelayan (SSE) untuk komunikasi pelanggan-pelayan masa nyata.
  5. Contoh pelaksanaan frontend praktikal daripada Dokumentasi ReactJS untuk membina antara muka pengguna interaktif.