대량 작업을 위해 서버 측 이벤트를 사용하는 NestJS의 간편한 알림

Temp mail SuperHeros
대량 작업을 위해 서버 측 이벤트를 사용하는 NestJS의 간편한 알림
대량 작업을 위해 서버 측 이벤트를 사용하는 NestJS의 간편한 알림

대량 삽입 작업을 위한 간소화된 알림 전달

부서, 등급, 경험 등 다양한 기준에 따라 수백 명의 직원에게 바우처가 할당되는 시스템을 관리한다고 상상해 보세요. 시스템에 병목 현상을 일으키지 않고 각 직원에게 효율적으로 알리는 것은 엄청난 작업입니다. 🔔 소켓이나 폴링 메커니즘의 복잡성을 피하려는 경우 이 과제는 더욱 어려워집니다.

이러한 시나리오에서 SSE(서버 측 이벤트)는 강력하면서도 간단한 솔루션으로 나타납니다. NestJS 애플리케이션에서 SSE를 활용하면 동적 기준에 따라 특정 직원 그룹에 알리는 실시간 통신 채널을 구축할 수 있습니다. 예를 들어, 바우처가 영업 부서에 할당되면 해당 직원만 알림을 받아 정확하고 의미 있는 업데이트를 보장해야 합니다.

이 기사를 통해 NestJS를 사용하여 SSE를 대량 삽입 프로세스에 통합하는 방법을 보여주는 실제 예제를 살펴보겠습니다. 원활한 성능을 유지하면서 백엔드에서 이벤트를 트리거하는 것부터 프런트엔드에서 업데이트를 수신하는 것까지 수명 주기를 살펴보겠습니다. 💼

HR 도구를 개발하든 재무 앱을 개발하든 이 워크플로를 이해하면 실시간으로 맞춤형 알림을 제공할 수 있습니다. SSE의 단순성과 SSE가 애플리케이션의 사용자 경험을 어떻게 향상시킬 수 있는지 살펴보겠습니다.

명령 사용예
@Sse SSE(서버 측 이벤트) 엔드포인트를 정의하는 데 사용되는 NestJS 데코레이터입니다. 예를 들어, @Sse('바우처를 받은 직원') 클라이언트에 실시간 업데이트를 스트리밍하도록 엔드포인트를 설정합니다.
fromEvent 에 의해 발생된 이벤트를 변환하는 RxJS의 함수 이벤트 이미터 관찰 가능한 스트림으로. 예를 들어, fromEvent(this.eventEmitter, '추가 바우처') 특정 이벤트를 수신합니다.
Observable 비동기 데이터 스트림을 관리하는 데 사용되는 RxJS의 핵심 개념입니다. NestJS에서 서버 측 이벤트를 처리하는 데 필수적입니다. 주목할 만한<MessageEvent>.
@InjectQueue Bull과 같은 라이브러리를 사용하여 작업 처리를 관리하는 데 유용한 대기열 인스턴스를 삽입하는 NestJS 데코레이터입니다. 예를 들어, @InjectQueue('allotVoucher') 'allotVoucher'라는 대기열에 대한 액세스를 제공합니다.
WorkerHost NestJS에서 사용자 정의 작업 프로세서를 정의할 수 있는 BullMQ의 기본 클래스입니다. 예를 들어, 할당바우처소비자 수업이 연장됩니다 작업자호스트 특정 작업을 처리합니다.
@OnWorkerEvent 대기열 작업의 특정 수명 주기 이벤트를 수신하는 데 사용되는 데코레이터입니다. 예를 들어, @OnWorkerEvent('완료') 작업의 "완료" 이벤트를 처리합니다.
createMany 한 번에 여러 레코드를 데이터베이스에 삽입하는 데 사용되는 Prisma 명령입니다. 예를 들어, prisma.employee Voucher.createMany 단일 작업으로 모든 직원의 바우처를 추가합니다.
EventSource 백엔드에서 서버 전송 이벤트(SSE)를 수신하기 위한 JavaScript API입니다. 예를 들어, 새로운 EventSource('http://localhost/vouchered-employee') 스트리밍 데이터에 대한 연결을 설정합니다.
add Bull 대기열에서 새 작업을 대기열에 추가하는 방법입니다. 예를 들어, allotVoucherQueue.add('allot-voucher', jobData) 처리할 작업을 예약합니다.
@OnEvent 애플리케이션 내에서 발생하는 특정 이벤트를 수신하는 NestJS 데코레이터입니다. 예를 들어, @OnEvent('할당 후-바우처') 이 이벤트가 발생하면 메서드를 트리거합니다.

서버 측 이벤트 및 대기열을 통한 효율적인 알림

제공된 스크립트는 바우처 기록을 데이터베이스에 대량 삽입한 후 직원에게 실시간 알림이 전송되는 시스템을 보여줍니다. 프로세스는 다음에서 시작됩니다. VoucherController 할당, 바우처 할당 작업을 생성하기 위한 엔드포인트를 노출합니다. 작업이 생성되면 다음과 같은 이벤트가 발생합니다. 할당 후 바우처. 이 이벤트는 후속 단계를 트리거하는 데 필수적이며 시스템이 이벤트 기반 및 모듈식인지 확인합니다. 이 설계를 통해 문제를 명확하게 분리할 수 있어 시스템의 유지 관리 및 확장성이 향상됩니다. 🎯

서비스 계층에서는 바우처 서비스 할당 BullMQ를 사용하여 대기열 작업에 대한 논리를 처리합니다. 수신 후 할당 후 바우처 이벤트가 발생하면 이름이 지정된 대기열에 작업이 추가됩니다. 할당권. 이 대기열을 사용하면 비동기식 처리가 가능하므로 대규모 데이터 세트를 처리하는 경우에도 시스템이 응답성을 유지합니다. 예를 들어 영업 부서의 직원 200명에게 바우처를 할당하는 경우 대기열은 해당 작업이 다른 요청을 차단하지 않도록 보장합니다. 대기열 구성에는 다음과 같은 옵션이 포함됩니다. 제거시 완료 작업 완료 후 Redis를 깨끗하게 유지합니다.

대기열 작업은 다음에 의해 처리됩니다. 할당바우처소비자 수업. 여기서는 해당 직원을 식별하고 바우처 기록을 데이터베이스에 삽입하는 로직이 구현됩니다. 프리즈마 명령 createMany 레코드를 일괄적으로 삽입하는 데 사용됩니다. 직원상품권 성능에 최적화된 테이블입니다. 데이터베이스 작업이 완료되면 구독자에게 알리기 위해 또 다른 이벤트가 발생합니다. 이 이벤트는 대량 삽입이 성공적으로 처리된 후에만 직원에게 알림을 보내 알림 시스템에 신뢰성을 추가합니다. 🌟

프런트엔드에서 React 구성 요소는 다음을 통해 서버에서 보낸 이벤트를 수신합니다. 이벤트 소스. 직원에게 알림이 전송되면 페이지를 새로 고칠 필요 없이 세부 정보가 UI에서 동적으로 업데이트됩니다. 이 접근 방식은 라이브 스포츠 점수나 소셜 미디어 알림과 같은 최신 웹 애플리케이션에서 볼 수 있는 실시간 업데이트와 유사한 원활한 사용자 경험을 제공합니다. 예를 들어 HR 부서의 직원은 백엔드가 할당 기준에 따라 이벤트를 정확하게 필터링하므로 영업용 업데이트를 볼 수 없습니다. 이러한 특수성은 성능과 관련성을 모두 향상시켜 사용자 중심 시스템을 만듭니다. 🖥️

NestJS에서 서버 측 이벤트(SSE)를 사용하여 대량 알림 보내기

이 솔루션은 대량 작업을 위해 Prisma 및 서버 측 이벤트(SSE)와 함께 NestJS를 사용하는 백엔드 접근 방식을 보여줍니다. 여기에는 이벤트 기반 아키텍처와 대기열 시스템이 포함됩니다.

// 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를 사용하여 서버측 이벤트를 수신하고 데이터가 수신될 때 UI를 동적으로 업데이트합니다. 대량 삽입 후 직원이 실시간으로 알림을 받을 수 있습니다.

// 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 테스트는 이벤트 방출 및 알림 메커니즘이 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);
  });
});

NestJS에서 SSE를 사용하여 실시간 시스템 강화

직원들에게 바우처 할당에 대해 알리기 위해 서버측 이벤트(SSE) 구현을 살펴보았지만 실시간 시스템에서 SSE를 사용하는 더 광범위한 사용 사례가 있습니다. SSE는 클라이언트가 지속적으로 폴링하지 않고 서버 데이터로 업데이트를 유지해야 하는 시나리오에서 빛을 발합니다. 예를 들어 반짝 세일 기간 동안 실시간 재고 업데이트를 추적하는 온라인 소매 플랫폼을 생각해 보세요. SSE를 사용하면 연결된 모든 클라이언트에 효율적으로 업데이트를 푸시하여 불필요한 서버 로드 없이 최신 재고 수준을 볼 수 있습니다. 이 접근 방식은 사용자 경험을 원활하게 유지하면서 확장성을 보장합니다. 🛒

BullMQ와 같은 고급 대기열 시스템을 통합했습니다. 할당권 대기열은 대량 데이터 처리 작업에 견고성을 추가합니다. 큐는 서버가 다시 시작되더라도 보류 중인 작업이 그대로 유지되고 처리가 재개되도록 보장합니다. 또한 재시도 메커니즘을 구성하여 실패한 작업(예: 임시 데이터베이스 가동 중지 시간으로 인해)이 자동으로 재시도되도록 할 수 있습니다. 예를 들어, 여러 부서에 걸쳐 직원 300명에 대한 할당에서 일시적인 오류가 발생하는 경우 대기열의 탄력성은 처리되지 않은 기록이 남아 있지 않도록 보장하여 시스템에 안정성을 추가합니다.

실시간 알림 외에도 SSE는 자세한 요약이 필요한 작업에 대한 이메일 서비스를 보완할 수도 있습니다. 모든 바우처 알림이 SSE를 통해 전송된 후 백엔드는 비동기적으로 보고서를 생성하고 관리자에게 통합 이메일을 보낼 수 있습니다. 이 다중 채널 통신은 즉각적인 알림과 포괄적인 후속 조치를 모두 보장하여 광범위한 사용자 선호 사항을 충족합니다. 이러한 통합은 시스템의 유연성을 향상시켜 균형 잡힌 사용자 경험을 제공합니다. 📧

NestJS의 SSE에 대해 자주 묻는 질문

  1. WebSocket보다 서버측 이벤트를 사용하면 어떤 이점이 있나요?
  2. SSE는 구현이 더 간단하고 HTTP를 사용하므로 방화벽 친화적입니다. WebSocket과 달리 단일 단방향 연결만 필요하므로 실시간 업데이트에 효율적입니다.
  3. 사용할 수 있나요? @Sse 컨트롤러에 여러 엔드포인트가 있나요?
  4. 예, 여러 개를 정의할 수 있습니다 @Sse 특정 요구 사항에 따라 클라이언트에 다양한 데이터 스트림을 제공하기 위해 동일한 컨트롤러의 엔드포인트.
  5. 대기열 처리 중 오류를 어떻게 처리합니까?
  6. BullMQ를 사용하면 재시도 옵션을 정의하고 다음과 같은 이벤트 리스너를 사용할 수 있습니다. @OnWorkerEvent('failed') 필요한 경우 오류를 기록하고 작업을 다시 처리합니다.
  7. 프리즈마는요? createMany 메소드가 트랜잭션 롤백을 지원합니까?
  8. 응, 프리즈마 createMany 트랜잭션으로 래핑될 수 있습니다. 트랜잭션의 작업 중 하나라도 실패하면 일관성을 위해 모든 작업이 롤백됩니다.
  9. SSE 스트림 중에 클라이언트 연결이 끊어지면 어떻게 되나요?
  10. 서버는 연결 끊김을 감지하면 업데이트 전송을 중지합니다. 다음을 사용하여 클라이언트에서 재연결 논리를 구현할 수 있습니다. EventSource API.
  11. SSE를 양방향 통신에 사용할 수 있습니까?
  12. 아니요, SSE는 단방향(서버-클라이언트)입니다. 양방향 통신의 경우 WebSocket 또는 HTTP2 스트림을 사용하십시오.
  13. NestJS에서 SSE 엔드포인트를 어떻게 보호하나요?
  14. 다음과 같은 가드나 미들웨어를 사용하세요. @UseGuards, SSE 엔드포인트에 대한 인증 및 권한 부여를 시행합니다.
  15. SSE는 브라우저가 아닌 클라이언트와도 작동할 수 있나요?
  16. 예, HTTP 및 이벤트 스트리밍(예: Node.js, cURL)을 지원하는 모든 클라이언트는 SSE 스트림을 사용할 수 있습니다.
  17. SSE 엔드포인트에 연결할 수 있는 클라이언트의 최대 수는 몇 개입니까?
  18. 이는 서버의 구성 및 리소스 제한에 따라 다릅니다. 로드 밸런싱과 클러스터링은 더 많은 클라이언트를 지원하도록 확장하는 데 도움이 됩니다.
  19. SSE를 통해 JSON 데이터를 보낼 수 있나요?
  20. 예, 객체를 JSON 문자열로 직렬화하고 다음을 사용하여 보낼 수 있습니다. new MessageEvent NestJS에서.

NestJS의 효과적인 실시간 알림

실시간 시스템을 구현하는 방법 SSE NestJS에서는 서버와 클라이언트 간의 통신을 단순화합니다. 이 방법은 지속적인 폴링에 비해 서버 부하를 줄이고 알림에 대한 정확한 타겟팅을 가능하게 합니다. 예를 들어 HR 도구는 다른 직원을 방해하지 않고 영업 부서의 직원 200명에게 새 바우처에 대해 알릴 수 있습니다. 🎯

BullMQ 및 Prisma와 같은 도구를 사용하면 이 설정을 통해 비동기 작업 처리 및 효율적인 데이터베이스 작업이 보장됩니다. 이벤트 기반 아키텍처의 유연성은 다양한 실시간 요구 사항에 대한 확장 가능한 솔루션을 제공하여 사용자 참여와 시스템 안정성을 향상시킵니다.

출처 및 참고자료
  1. 에 대한 자세한 문서 NestJS 프레임워크 확장 가능한 서버 측 애플리케이션 구축을 위한 것입니다.
  2. 이용안내 BullMQ Node.js 애플리케이션의 강력한 작업 대기열 관리를 위해.
  3. 공식적인 프리즈마 문서 데이터베이스 작업 및 ORM 사용을 위해.
  4. 에 대한 통찰력 서버에서 보낸 이벤트(SSE) 실시간 클라이언트-서버 통신을 위해.
  5. 실제 프론트엔드 구현 예 ReactJS 문서 대화형 사용자 인터페이스를 구축하기 위한 것입니다.