$lang['tuto'] = "hướng dẫn"; ?> Thông báo dễ dàng trong NestJS bằng cách sử dụng

Thông báo dễ dàng trong NestJS bằng cách sử dụng sự kiện phía máy chủ cho hoạt động hàng loạt

Temp mail SuperHeros
Thông báo dễ dàng trong NestJS bằng cách sử dụng sự kiện phía máy chủ cho hoạt động hàng loạt
Thông báo dễ dàng trong NestJS bằng cách sử dụng sự kiện phía máy chủ cho hoạt động hàng loạt

Phân phối thông báo hợp lý cho hoạt động chèn hàng loạt

Hãy tưởng tượng bạn đang quản lý một hệ thống trong đó hàng trăm nhân viên được cấp chứng từ dựa trên nhiều tiêu chí khác nhau như bộ phận, cấp bậc hoặc kinh nghiệm. Nhiệm vụ to lớn là thông báo cho từng nhân viên một cách hiệu quả mà không gây tắc nghẽn trong hệ thống. 🔔 Thử thách này càng trở nên khó khăn hơn khi bạn muốn tránh sự phức tạp của socket hoặc cơ chế thăm dò ý kiến.

Trong những tình huống như vậy, Sự kiện phía máy chủ (SSE) nổi lên như một giải pháp mạnh mẽ nhưng đơn giản. Bằng cách tận dụng SSE trong ứng dụng NestJS, bạn có thể thiết lập kênh liên lạc theo thời gian thực để thông báo cho các nhóm nhân viên cụ thể dựa trên tiêu chí động. Ví dụ: khi chứng từ được phân bổ cho bộ phận Bán hàng, chỉ những nhân viên đó mới nhận được thông báo, đảm bảo cập nhật chính xác và có ý nghĩa.

Thông qua bài viết này, chúng ta sẽ đi sâu vào một ví dụ thực tế trình bày cách tích hợp SSE vào quy trình chèn hàng loạt bằng NestJS. Chúng ta sẽ tìm hiểu vòng đời, từ việc kích hoạt các sự kiện trong phần phụ trợ đến lắng nghe các bản cập nhật trên giao diện người dùng, trong khi vẫn duy trì hiệu suất liền mạch. 💼

Cho dù bạn đang phát triển công cụ nhân sự hay ứng dụng tài chính, việc hiểu quy trình làm việc này sẽ giúp bạn gửi thông báo được cá nhân hóa theo thời gian thực. Hãy cùng làm sáng tỏ sự đơn giản của SSE và cách nó có thể nâng cao trải nghiệm người dùng ứng dụng của bạn.

Yêu cầu Ví dụ về sử dụng
@Sse Trình trang trí NestJS dùng để xác định điểm cuối Sự kiện phía máy chủ (SSE). Ví dụ, @Sse('nhân viên được chứng nhận') thiết lập điểm cuối để truyền phát các bản cập nhật theo thời gian thực tới máy khách.
fromEvent Một hàm từ RxJS chuyển đổi một sự kiện được phát ra bởi một Sự kiệnEmitter thành một dòng có thể quan sát được. Ví dụ, fromEvent(this.eventEmitter, 'sau khi thêm chứng từ') lắng nghe một sự kiện cụ thể.
Observable Một khái niệm cốt lõi của RxJS được sử dụng để quản lý các luồng dữ liệu không đồng bộ. Điều cần thiết là xử lý các Sự kiện phía máy chủ trong NestJS, như Có thể quan sát được<MessageEvent>.
@InjectQueue Trình trang trí NestJS chèn một phiên bản hàng đợi, hữu ích để quản lý quá trình xử lý công việc bằng các thư viện như Bull. Ví dụ, @InjectQueue('allotVoucher') cung cấp quyền truy cập vào hàng đợi có tên 'allotVoucher'.
WorkerHost Lớp cơ sở của BullMQ cho phép xác định bộ xử lý công việc tùy chỉnh trong NestJS. Ví dụ, Phân bổVoucherNgười tiêu dùng lớp mở rộng máy chủ công nhân để giải quyết các công việc cụ thể.
@OnWorkerEvent Trình trang trí được sử dụng để lắng nghe các sự kiện vòng đời cụ thể của một công việc xếp hàng. Ví dụ, @OnWorkerEvent('đã hoàn thành') xử lý sự kiện "hoàn thành" của một công việc.
createMany Lệnh Prisma được sử dụng để chèn nhiều bản ghi vào cơ sở dữ liệu cùng một lúc. Ví dụ, prisma.employee Voucher.createMany thêm tất cả các chứng từ của nhân viên trong một thao tác.
EventSource API JavaScript để nhận các sự kiện do máy chủ gửi (SSE) từ chương trình phụ trợ. Ví dụ, Nguồn sự kiện mới('http://localhost/vouched-employee') thiết lập một kết nối để truyền dữ liệu.
add Một phương thức từ hàng đợi Bull để thêm công việc mới vào hàng đợi. Ví dụ, allotVoucherQueue.add('allot-voucher', jobData) sắp xếp một công việc để xử lý.
@OnEvent Trình trang trí NestJS lắng nghe các sự kiện cụ thể được phát ra trong ứng dụng. Ví dụ, @OnEvent('after-allocate-voucher') kích hoạt một phương thức khi sự kiện này được phát ra.

Thông báo hiệu quả với hàng đợi và sự kiện phía máy chủ

Các tập lệnh được cung cấp minh họa một hệ thống trong đó thông báo theo thời gian thực được gửi tới nhân viên sau khi chèn hàng loạt bản ghi chứng từ vào cơ sở dữ liệu. Quá trình bắt đầu trong Phân bổPhiếu điều khiển, hiển thị điểm cuối để tạo nhiệm vụ phân bổ chứng từ. Khi một tác vụ được tạo, nó sẽ phát ra một sự kiện có tên chứng từ sau phân bổ. Sự kiện này rất cần thiết để kích hoạt các bước tiếp theo, đảm bảo rằng hệ thống được điều khiển theo sự kiện và theo mô-đun. Thiết kế này cho phép phân tách rõ ràng các mối quan tâm, giúp hệ thống dễ bảo trì và mở rộng hơn. 🎯

Trong lớp dịch vụ, Phân bổPhiếuDịch vụ xử lý logic để xếp hàng các tác vụ bằng BullMQ. Sau khi nhận được chứng từ sau phân bổ sự kiện, nó thêm một công việc vào hàng đợi có tên phiếu phân bổ. Hàng đợi này cho phép xử lý không đồng bộ, đảm bảo hệ thống vẫn phản hồi ngay cả khi xử lý các tập dữ liệu lớn. Ví dụ: nếu bạn phân bổ chứng từ cho 200 nhân viên trong bộ phận Bán hàng, hàng đợi sẽ đảm bảo rằng thao tác này không chặn các yêu cầu khác. Cấu hình của hàng đợi bao gồm các tùy chọn như xóaOnComplete để giữ cho Redis sạch sẽ sau khi hoàn thành công việc.

Các công việc hàng đợi được xử lý bởi Phân bổVoucherNgười tiêu dùng lớp học. Ở đây, logic để xác định các nhân viên có liên quan và chèn bản ghi chứng từ vào cơ sở dữ liệu được triển khai. Lệnh Prisma tạo nhiều được sử dụng để chèn các bản ghi hàng loạt vào chứng từ nhân viên table, được tối ưu hóa cho hiệu suất. Sau khi thao tác cơ sở dữ liệu hoàn tất, một sự kiện khác sẽ được phát ra để thông báo cho người đăng ký. Sự kiện này đảm bảo rằng nhân viên chỉ được thông báo sau khi quá trình chèn hàng loạt được xử lý thành công, tăng thêm độ tin cậy cho hệ thống thông báo. 🌟

Ở giao diện người dùng, thành phần React lắng nghe các sự kiện do máy chủ gửi thông qua một Nguồn sự kiện. Khi nhân viên được thông báo, thông tin chi tiết của họ sẽ được cập nhật động trong giao diện người dùng mà không yêu cầu làm mới trang. Cách tiếp cận này cung cấp trải nghiệm người dùng liền mạch, giống như các cập nhật theo thời gian thực được thấy trong các ứng dụng web hiện đại như tỷ số thể thao trực tiếp hoặc thông báo trên mạng xã hội. Ví dụ: nhân viên trong bộ phận nhân sự sẽ không thấy các bản cập nhật dành cho Bán hàng vì phần phụ trợ lọc chính xác các sự kiện dựa trên tiêu chí phân bổ. Tính đặc hiệu này nâng cao cả hiệu suất và mức độ phù hợp, tạo ra một hệ thống lấy người dùng làm trung tâm. 🖥️

Gửi thông báo hàng loạt với các sự kiện phía máy chủ (SSE) trong NestJS

Giải pháp này thể hiện cách tiếp cận phụ trợ để sử dụng NestJS với Prisma và Sự kiện phía máy chủ (SSE) cho các hoạt động hàng loạt. Nó bao gồm một kiến ​​trúc hướng sự kiện và hệ thống xếp hàng.

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

Cập nhật theo thời gian thực để chèn hàng loạt bằng NestJS và React

Ví dụ về giao diện người dùng này sử dụng React để lắng nghe Sự kiện phía máy chủ và cập nhật giao diện người dùng một cách linh hoạt khi nhận được dữ liệu. Nó đảm bảo nhân viên nhận được thông báo theo thời gian thực sau khi chèn hàng loạt.

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

Thông báo kiểm tra đơn vị cho hoạt động chèn hàng loạt

Thử nghiệm Jest này đảm bảo cơ chế thông báo và phát sự kiện hoạt động chính xác trong phần phụ trợ cho Sự kiện phía máy chủ trong 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);
  });
});

Tăng cường hệ thống thời gian thực với SSE trong NestJS

Mặc dù chúng tôi đã khám phá việc triển khai Sự kiện phía máy chủ (SSE) để thông báo cho nhân viên về việc phân bổ phiếu thưởng, nhưng có một trường hợp sử dụng rộng hơn cho SSE trong các hệ thống thời gian thực. SSE tỏa sáng trong các tình huống mà khách hàng cần cập nhật dữ liệu máy chủ mà không cần thăm dò liên tục. Ví dụ: hãy nghĩ về một nền tảng bán lẻ trực tuyến theo dõi cập nhật hàng tồn kho trực tiếp trong đợt giảm giá nhanh. Bằng cách sử dụng SSE, bạn có thể đẩy các bản cập nhật tới tất cả các máy khách được kết nối một cách hiệu quả, đảm bảo họ xem được lượng hàng tồn kho mới nhất mà không phải tải máy chủ không cần thiết. Cách tiếp cận này đảm bảo khả năng mở rộng trong khi vẫn giữ được trải nghiệm người dùng liền mạch. 🛒

Kết hợp các hệ thống xếp hàng nâng cao như BullMQ, như chúng tôi đã làm với phiếu phân bổ hàng đợi, tăng thêm độ mạnh mẽ cho các tác vụ xử lý dữ liệu hàng loạt. Hàng đợi đảm bảo rằng ngay cả khi máy chủ khởi động lại, các tác vụ đang chờ xử lý vẫn được giữ nguyên và quá trình xử lý sẽ tiếp tục. Ngoài ra, cơ chế thử lại có thể được cấu hình, đảm bảo các công việc không thành công (ví dụ: do cơ sở dữ liệu tạm thời ngừng hoạt động) được thử lại tự động. Ví dụ: nếu việc phân bổ cho 300 nhân viên giữa các phòng ban gặp phải lỗi tạm thời, khả năng phục hồi của hàng đợi sẽ đảm bảo không có bản ghi nào chưa được xử lý, tăng thêm độ tin cậy cho hệ thống của bạn.

Ngoài thông báo theo thời gian thực, SSE còn có thể bổ sung các dịch vụ email cho các tác vụ yêu cầu tóm tắt chi tiết. Sau khi tất cả thông báo chứng từ được gửi qua SSE, phần phụ trợ có thể tạo báo cáo không đồng bộ và gửi email tổng hợp cho người quản lý. Giao tiếp đa kênh này đảm bảo cả thông báo ngay lập tức và theo dõi toàn diện, đáp ứng nhiều sở thích của người dùng. Việc tích hợp như vậy sẽ nâng cao tính linh hoạt của hệ thống của bạn, tạo ra trải nghiệm toàn diện cho người dùng. 📧

Câu hỏi thường gặp về SSE trong NestJS

  1. Lợi ích của việc sử dụng Sự kiện phía máy chủ trên WebSockets là gì?
  2. SSE dễ triển khai và sử dụng HTTP hơn, khiến nó thân thiện với tường lửa. Không giống như WebSockets, nó chỉ yêu cầu một kết nối một chiều duy nhất, hiệu quả cho việc cập nhật theo thời gian thực.
  3. Tôi có thể sử dụng không? @Sse với nhiều điểm cuối trong bộ điều khiển?
  4. Có, bạn có thể xác định nhiều @Sse điểm cuối trong cùng một bộ điều khiển để phục vụ các luồng dữ liệu khác nhau cho khách hàng dựa trên nhu cầu cụ thể.
  5. Làm cách nào để xử lý lỗi trong quá trình xử lý hàng đợi?
  6. Với BullMQ, bạn có thể xác định các tùy chọn thử lại và sử dụng trình xử lý sự kiện như @OnWorkerEvent('failed') để ghi lại lỗi và xử lý lại công việc nếu cần thiết.
  7. Liệu Prisma có createMany phương pháp hỗ trợ khôi phục giao dịch?
  8. Vâng, của Prisma createMany có thể được gói gọn trong một giao dịch. Nếu bất kỳ thao tác nào trong giao dịch không thành công, tất cả các thao tác sẽ được khôi phục để đảm bảo tính nhất quán.
  9. Điều gì xảy ra nếu máy khách ngắt kết nối trong luồng SSE?
  10. Máy chủ ngừng gửi bản cập nhật khi phát hiện mất kết nối. Bạn có thể triển khai logic kết nối lại trên máy khách bằng cách sử dụng EventSource API.
  11. SSE có thể được sử dụng để liên lạc hai chiều không?
  12. Không, SSE là một chiều (từ máy chủ đến máy khách). Để liên lạc hai chiều, hãy sử dụng luồng WebSockets hoặc HTTP2.
  13. Làm cách nào để bảo mật điểm cuối SSE trong NestJS?
  14. Sử dụng các phần mềm bảo vệ hoặc phần mềm trung gian, như @UseGuards, để thực thi xác thực và ủy quyền cho điểm cuối SSE của bạn.
  15. SSE có thể hoạt động với các máy khách không có trình duyệt không?
  16. Có, bất kỳ ứng dụng khách nào hỗ trợ HTTP và truyền phát sự kiện (ví dụ: Node.js, cURL) đều có thể sử dụng luồng SSE.
  17. Số lượng máy khách tối đa có thể kết nối với điểm cuối SSE là bao nhiêu?
  18. Điều này phụ thuộc vào cấu hình máy chủ và giới hạn tài nguyên của bạn. Cân bằng tải và phân cụm có thể giúp mở rộng quy mô để hỗ trợ nhiều khách hàng hơn.
  19. Có thể gửi dữ liệu JSON qua SSE không?
  20. Có, bạn có thể tuần tự hóa các đối tượng thành chuỗi JSON và gửi chúng bằng cách sử dụng new MessageEvent trong NestJS.

Thông báo thời gian thực hiệu quả trong NestJS

Triển khai hệ thống thời gian thực bằng cách sử dụng SSE trong NestJS đơn giản hóa việc giao tiếp giữa máy chủ và máy khách. Phương pháp này giúp giảm tải máy chủ so với bỏ phiếu liên tục và cho phép nhắm mục tiêu chính xác cho thông báo. Ví dụ: một công cụ nhân sự có thể thông báo cho 200 nhân viên trong bộ phận Bán hàng về các chứng từ mới mà không làm gián đoạn những người khác. 🎯

Với các công cụ như BullMQ và Prisma, thiết lập này đảm bảo xử lý tác vụ không đồng bộ và vận hành cơ sở dữ liệu hiệu quả. Tính linh hoạt của kiến ​​trúc dựa trên sự kiện khiến nó trở thành giải pháp có thể mở rộng cho các yêu cầu thời gian thực khác nhau, nâng cao mức độ tương tác của người dùng và độ tin cậy của hệ thống.

Nguồn và Tài liệu tham khảo
  1. Tài liệu chi tiết về Khung NestJS để xây dựng các ứng dụng phía máy chủ có thể mở rộng.
  2. Hướng dẫn sử dụng BullMQ để quản lý hàng đợi công việc mạnh mẽ trong các ứng dụng Node.js.
  3. Chính thức Tài liệu Prisma cho các hoạt động cơ sở dữ liệu và sử dụng ORM.
  4. Thông tin chi tiết về Sự kiện do máy chủ gửi (SSE) để liên lạc giữa máy khách và máy chủ theo thời gian thực.
  5. Các ví dụ triển khai giao diện người dùng thực tế từ Tài liệu ReactJS để xây dựng giao diện người dùng tương tác.