콘텐츠로 이동

중요 참고 사항

Source URL: https://docs.bullmq.io/bull/important-notes

이 큐는 “at least once” 작업 전략을 목표로 합니다. 즉, 일부 상황에서는 하나의 작업이 두 번 이상 처리될 수 있습니다. 이는 주로 워커가 작업 처리 전체 시간 동안 해당 작업의 락을 유지하지 못할 때 발생합니다.

워커가 작업을 처리하는 동안에는 다른 워커가 해당 작업을 처리하지 못하도록 작업을 “locked” 상태로 유지합니다.

작업 락이 해제되어 stalled 상태가 되고, 그 결과 재시작되는 일을 방지하려면 락이 어떻게 동작하는지 이해하는 것이 중요합니다. 락은 내부적으로 lockRenewTime 간격(보통 lockDuration의 절반)마다 lockDuration 동안의 락을 생성하는 방식으로 구현됩니다. 락을 갱신하기 전에 lockDuration이 만료되면 해당 작업은 stalled로 간주되어 자동으로 재시작되며, 중복 처리됩니다. 이런 일은 다음과 같은 경우에 발생할 수 있습니다.

  1. 작업 프로세서를 실행 중인 Node 프로세스가 예기치 않게 종료된 경우.
  2. 작업 프로세서의 CPU 사용량이 너무 높아 Node 이벤트 루프가 멈췄고, 그 결과 Bull이 작업 락을 갱신하지 못한 경우(이를 더 잘 감지하는 방법은 #488 참고). 이를 해결하려면 작업 프로세서를 더 작은 단위로 나누어 어떤 단일 단계도 Node 이벤트 루프를 막지 않게 해야 합니다. 또는 lockDuration 설정 값을 더 크게 줄 수 있습니다(단, 실제 stalled 작업을 인식하는 데 더 오래 걸린다는 트레이드오프가 있습니다).

따라서 항상 stalled 이벤트를 수신하고 이를 오류 모니터링 시스템에 기록해야 합니다. 이는 작업이 중복 처리되고 있을 가능성이 높다는 의미입니다.

문제가 있는 작업이 무한정 재시작되지 않도록(예: 작업 프로세서가 항상 Node 프로세스를 크래시시키는 경우), 작업은 stalled 상태에서 최대 maxStalledCount번까지만 복구됩니다(기본값: 1).