백그라운드 작업과 워커
백그라운드 작업과 워커가 비동기적이고 오래 걸리며 블로킹되지 않는 백엔드 작업을 어떻게 처리하는지 살펴보세요.
백그라운드 작업이 존재하는 이유
일부 작업은 요청 처리 중에 실행하기에는 너무 오래 걸리므로, 시스템을 빠르고 반응성 있게 유지하기 위해 요청 생명주기 밖으로 옮겨야 합니다.
- 오래 걸리는 작업은 사용자 응답을 크게 지연시킬 수 있습니다.
- 대표적인 예로 이메일 전송, 보고서 생성, 미디어 파일 처리 등이 있습니다.
- 백그라운드 작업을 사용하면 이러한 작업을 사용자 요청과 분리해서 실행할 수 있습니다.
상세정보
일반적인 백엔드 시스템에서는 요청이 빠르게 완료되기를 기대합니다. 사용자는 보통 밀리초 단위 또는 길어도 몇 초 이내의 응답을 기대합니다. 하지만 업로드된 비디오 처리, 대용량 보고서 생성, 많은 사용자에게 알림 전송처럼 훨씬 더 오래 걸리는 작업도 있습니다.
이러한 작업을 요청 생명주기 안에서 직접 실행하면, 서버는 응답하기 전에 작업이 끝날 때까지 기다려야 합니다. 이로 인해 응답 시간이 느려지고, 특히 트래픽이 많은 상황에서는 타임아웃이 발생할 수도 있습니다.
이는 사용자 경험을 떨어뜨릴 뿐만 아니라, 새 요청을 처리해야 할 자원이 오래 걸리는 작업에 묶이게 되어 시스템 효율도 낮춥니다.
이를 해결하기 위해 백엔드 시스템은 이러한 작업을 백그라운드로 옮깁니다. 서버는 클라이언트에 빠르게 응답하고, 오래 걸리는 작업은 요청 생명주기 밖에서 비동기적으로 계속 실행됩니다.
이러한 분리는 현대 백엔드 시스템의 기본적인 설계 패턴으로, 빠른 응답을 제공하면서도 복잡하고 시간이 많이 드는 작업을 안정적으로 처리할 수 있게 해줍니다.
워커 프로세스
워커 프로세스는 메인 웹 서버와는 별도로 백그라운드 작업을 실행하는 전용 프로그램입니다.
- 워커는 웹 서버와 분리되어 실행되며 작업 처리에만 집중합니다.
- 이들은 큐에서 작업을 지속적으로 가져와 처리합니다.
- 워커를 더 추가하면 시스템 처리량과 병렬 처리 क्षमता가 증가합니다.
상세정보
워커 프로세스는 큐에 저장된 작업을 실행하는 역할을 합니다. 들어오는 요청을 처리하는 웹 서버와 달리, 워커는 독립적으로 동작하며 백그라운드 작업 실행에 최적화되어 있습니다.
각 워커는 작업 큐를 지속적으로 감시하다가 작업이 उपलब्ध해지면 이를 가져옵니다. 작업을 가져오면 워커가 이를 처리한 뒤 다음 작업으로 넘어갑니다.
워커는 별도의 프로세스로 실행되므로 메인 애플리케이션과 독립적으로 확장할 수 있습니다. 이를 통해 시스템은 요청 처리 속도를 늦추지 않으면서 증가하는 작업량을 처리할 수 있습니다.
워커를 더 추가하면 여러 작업을 병렬로 처리할 수 있어 처리량이 증가하며, 이는 대량의 백그라운드 작업을 효율적으로 처리하는 데 매우 중요합니다.
메시지 브로커와 큐 시스템
메시지 브로커는 백그라운드 작업을 저장하고, 분배하며, 워커에게 안정적으로 전달하는 인프라를 제공합니다.
- 메시지 브로커는 작업 큐의 기반 시스템 역할을 합니다.
- 일반적인 기술로는 Kafka, RabbitMQ, AWS SQS가 있습니다.
- 이들은 작업이 안정적으로 저장, 전달, 처리되도록 보장합니다.
상세정보
메시지 브로커는 애플리케이션과 워커 프로세스 사이에 위치하여 작업의 흐름을 관리하는 시스템입니다. 애플리케이션이 작업을 생성하면, 이를 워커에 직접 보내는 대신 브로커로 보냅니다.
브로커는 작업을 내구성 있게 저장하여, 시스템의 일부가 실패하더라도 작업이 유실되지 않도록 합니다. 이는 특히 언제든 장애가 발생할 수 있는 분산 시스템에서 신뢰성을 위해 매우 중요합니다.
그다음 워커는 브로커에 연결해, 처리할 준비가 되었을 때 작업을 가져옵니다. 이렇게 하면 애플리케이션과 실행 계층이 분리되어, 양쪽을 독립적으로 확장할 수 있습니다.
메시지 브로커는 분산 처리도 지원하여, 서로 다른 여러 머신의 여러 워커가 동시에 작업을 처리하면서도 안정적인 전달 보장을 유지할 수 있게 합니다.
지연 작업
지연 작업을 사용하면 작업을 즉시 실행하는 대신 나중 시점에 실행되도록 예약할 수 있습니다.
- 작업은 특정 지연 시간 이후에 실행되도록 예약할 수 있습니다.
- 일반적인 사용 사례로는 알림과 실패한 작업의 재시도가 있습니다.
- 이를 통해 백엔드 시스템에서 시간 기반 자동화를 구현할 수 있습니다.
상세정보
모든 작업을 즉시 실행해야 하는 것은 아닙니다. 많은 경우, 24시간 후에 알림 이메일을 보내거나 짧은 지연 후 실패한 작업을 다시 시도하는 것처럼 작업을 나중 시점에 수행하도록 예약해야 합니다.
지연 작업을 사용하면 시스템이 작업을 바로 처리하는 대신 언제 실행할지 정의할 수 있습니다. 작업은 지연 시간 또는 예약 시간과 함께 저장되며, 시스템은 해당 시간이 되면 작업이 실행되도록 보장합니다.
이는 일반적으로 작업이 워커에게 제공되어야 하는 시점을 추적하는 메시지 브로커나 스케줄링 시스템을 사용해 구현됩니다. 지연 시간이 만료되기 전까지 작업은 비활성 상태로 유지되며 워커가 가져가지 않습니다.
예약된 시간이 되면 작업은 활성 큐로 이동하고 다른 작업과 마찬가지로 처리됩니다. 이 메커니즘은 신뢰할 수 있는 재시도 시스템과 시간 기반 워크플로를 구축하는 데 필수적입니다.
지연 실행은 현대 백엔드 시스템의 핵심 기능으로, 수동 개입 없이 자동화를 가능하게 하고 장애 허용성을 향상시킵니다.
Cron 작업
Cron 작업은 고정된 일정에 따라 작업을 자동으로 실행하여, 수동 개입 없이 반복 작업을 수행할 수 있게 합니다.
- Cron 작업은 미리 정의된 시간 간격에 따라 작업을 실행합니다.
- 일반적인 사용 사례로는 유지보수, 보고서 생성, 청구가 있습니다.
- 이 작업은 사용자 요청이 아니라 스케줄러에 의해 트리거됩니다.
상세정보
Cron 작업은 매일 밤, 매일, 또는 매주처럼 특정 시간이나 간격에 작업을 반복 실행하는 데 사용됩니다. 사용자 동작에 의해 트리거되는 백그라운드 작업과 달리, Cron 작업은 스케줄러에 의해 시작됩니다.
스케줄러는 흔히 cron이라고도 불리며, 시간 기반 규칙을 추적하고 해당 조건이 충족되면 작업을 트리거합니다. 예를 들어, 어떤 시스템은 매일 자정에 데이터베이스 정리 작업을 실행하거나 매일 아침 분석 보고서를 생성할 수 있습니다.
트리거된 후 예약된 작업은 일반적으로 워커 프로세스로 전달되거나 백그라운드 작업으로 실행됩니다. 이를 통해 시스템은 실시간 요청 처리에 영향을 주지 않으면서 반복적인 작업 부하를 처리할 수 있습니다.
Cron 작업은 일상적인 운영을 자동화하는 데 필수적이며, 유지보수와 주기적인 작업이 수동 노력 없이 일관되게 수행되도록 보장합니다.
백그라운드 작업의 실패 처리
백그라운드 작업은 실패할 수 있으므로, 시스템은 작업이 결국 완료되도록 재시도 전략을 구현해야 합니다.
- 분산 시스템에서는 실패가 예상되며, 이를 명시적으로 처리해야 합니다.
- 재시도 큐를 사용하면 실패한 작업을 다시 시도할 수 있습니다.
- 데드 레터 큐는 반복적으로 실패하는 작업을 저장합니다.
상세정보
백그라운드 작업은 데이터베이스, API, 네트워크 서비스와 같은 외부 시스템에 의존하는 경우가 많으며, 이러한 시스템은 예측할 수 없이 실패할 수 있습니다. 따라서 실패 처리는 어떤 백그라운드 작업 시스템에서든 매우 중요한 부분입니다.
일반적인 접근 방식 중 하나는 실패한 작업을 재시도하는 것입니다. 작업이 실패하면 재시도 큐에 다시 넣고, 일정 시간 후 다시 시도합니다. 이렇게 하면 실패가 일시적이었을 때 성공할 가능성이 높아집니다.
시스템에 과부하가 걸리지 않도록, 재시도는 보통 지수 백오프를 사용해 간격을 두고 수행합니다. 이 방식에서는 각 재시도가 이전보다 더 오래 기다립니다. 이렇게 하면 짧은 시간에 반복되는 실패로 인해 추가 부하가 발생하는 것을 막을 수 있습니다.
작업이 너무 많이 실패하면 데드 레터 큐로 이동합니다. 이를 통해 엔지니어는 나머지 시스템을 막지 않고도 문제가 있는 작업을 검사하고 디버깅할 수 있습니다.
이러한 패턴은 실패가 발생하더라도 백그라운드 처리가 안정적으로 동작하도록 보장하며, 이는 견고한 백엔드 시스템을 구축하는 데 필수적입니다.
질문 섹션
1 / 5
이 레슨은 프리미엄 콘텐츠입니다
프리미엄으로 업그레이드하여 흐림 효과를 없애고 전체 내용을 읽어 보세요.