Nest

[Nest] Bull사용한 병렬처리

chu_dw 2024. 4. 19. 22:35

이전 글에서 worker thread pool 을 사용해서 병렬처리를 구현했었다.

하지만 nest가 제공하는 Bull 라이브러리를 사용하면 더 간결한 방법으로 병렬처리를 구현할 수 있다.

 

Bull이란?

nodejs기반 분산 작업 큐 라이브러리로

redis를 기반으로 대기열에서 작업을 효율적으로 처리하고 실행한다.

 

Bull동작

Producer(생산자)가 Queue에 작업 메세지를 추가한다.

Consumer(처리자)가 Queue에서 메세지를 가져와서 작업을 수행한다.

여기서 queue에대한 데이터를 저장하고 관리를 redis가 한다.

 

이때 Consumer를 옵션을 통해 병렬로 동시에 처리하도록 설정이 가능하다.

즉 이전 코드에서 woker의 역할이 되는 것이다. 

 

Bull 패키지 설치

바로 프로젝트에 적용해 보겠다.

npm install --save @nestjs/bull bull  
npm install --save-dev @types/bull

먼저 위 명령어로 bull의존성을 설치해준다.

 

 

모듈 설정

letter에서 사용할 것이기 때문에 letter.module에 redis와 함께 등록해 준다.

그리고 사용할 큐를 registerQueue()를 사용해 생성해 준다. name이 rank인 큐를 만들어 주었다.

이렇게 만들어준 큐는 서비스에 와서 @InjectQueue로 주입해 준다.

 

 

job 생성

job은 큐에서 동작하는 작업으로, job은 고유한 식별자를 가지고 작업에 대한 데이터를 가지고 있다.

생성한 큐에. add() 메서드로 Job을 추가할 수 있다.

여기서 rankJob은 job의 이름이고 두 번째 파라미터는 job에 전달할 데이터이다.

finished()는 job이 완료될 때까지 기다리다 작업이 완료되면 결과를 리턴해준다.

 

job 구현

rankword-processor.ts 파일은 만들어 job기능을 구현해주겠다.

(디렉토리 너무 많아질 거 같아서 workers 디렉토리에 같이 만들어 줬다.)

@Processor로 어떤 큐에서 Job을 처리할지 정해준다. module에서 만들어준 큐의 이름을 넣어주면 된다.

@Process는 해당 메서드와 특정 job을 처리하는 메서드임을 지정해 준다.

위 job 생성에서 만들어진 이름의 job이 해당 코드로 구현시켜 준다.

job이름 다음 파라미터로 넘겨줬던 데이터를 job.data로 추출해 로직을 실행한다.

 

letter모듈에 위 클래스를 provider로 등록하고 실행시키면 worker사용했을 때와 동일하게 작동한다.

 

 

job 추가 옵션

Priority: 작업의 우선순위, 우선순위 값이 높을수록 (1이 가장 높음) 더 높은 우선순위로 처리

Delay: 작업을 처리하기 전에 대기하는 시간

Attempts: 작업이 성공적으로 완료될 때까지 시도할 총 횟수

Repeat: cron 표현식에 따라 작업을 반복하여 예약하는 옵션

Backoff: 작업이 실패할 경우 지수적 백오프로 자동 재시도를 위한 옵션

LIFO: true로 설정하면 작업을 큐의 왼쪽 끝이 아닌 오른쪽 끝에 추가

Timeout: 작업이 오류로 인해 타임아웃될 때까지의 최대 시간

Job ID: 기본 작업 ID를 사용자 정의 문자열이나 숫자로 재정의, 사용자 지정 ID는 고유해야 하며 기존 ID를 사용하여 작업을 추가하려고 하면 실패

Remove on Complete: true로 설정하면 작업이 성공적으로 완료된 후 큐에서 작업을 제거. 특정 수의 완료된 작업을 유지하도록 숫자를 지정 가능

Remove on Fail: true로 설정하면 모든 시도가 실패한 후 큐에서 작업을 제거, 실패한 작업을 유지하도록 숫자를 지정 가능. 기본적으로 실패한 작업은 실패한 세트에 유지

Stack Trace Limit: 작업 스택 추적에 기록되는 스택 추적 수를 제한

 

 

 

Bull 사용 이유

이전 코드에서 worker pool을 직접 구현한 거보다 코드가 훨씬 간결해졌고 여러 옵션 설정 또한 쉽게 할 수 있다.

즉 더 신속하고 안정적인 작업이 가능하다.

큐 작업 최적화도 더 잘되어있어서 처리시간도 더 짧아진다고 한다 (내 코드에선 큰 차이는 확인 못했다,,ㅠ)

 

 

https://overcome-the-limits.tistory.com/679?category=1006727

 

[Project] 프로젝트 삽질기10 (feat bull 공식문서 정리)

들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 그 과정에서 생각하고 배웠던 점들을 하나씩 작성하고자 합니다. 저번 글에서는 Queue에 대해 알아봤고, Queue 중

overcome-the-limits.tistory.com

https://velog.io/@ninthsun91/Nestjs-Worker-Thread%EC%99%80-Bull%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%9C-%ED%81%90%EC%9D%98-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC

 

[Nestjs] Worker Thread와 Bull을 사용한 큐의 병렬 처리

어떤 리스트를 불러와 랭킹 알고리즘을 바탕으로 정렬을 할 때, 보통 이 정렬하는 로직은 동기적으로 이루어진 코드 비중이 높을 것이며 리스트의 길이가 길어질수록 cpu의 연산량도 많아진다.

velog.io