웹 애플리케이션 비동기 작업의 필요성과 설계 지침

Sidekiq その前に:Webアプリケーションにおける非同期ジョブ設計原則 / morihirok - Kaigi on Rails 2025

작성자
Kaigi on Rails
발행일
2025년 11월 25일

핵심 요약

  • 1 웹 서버의 장시간 요청 처리 한계로 인해 비동기 작업(Asynchronous Job)은 웹 애플리케이션의 성능과 효율성을 위한 필수적인 요소입니다.
  • 2 비동기 작업은 짧고, 단순하며, 멱등성(Idempotent)과 트랜잭션(Transactional)을 보장하도록 설계하여 복잡성을 최소화하고 안정적인 운영을 도모해야 합니다.
  • 3 장시간 비동기 작업이 불가피할 경우, Active Job Continuations, Sidekiq Iteration, AWS Step Functions 등 전용 라이브러리나 외부 서비스를 활용하여 안전하게 처리해야 합니다.
  • 4 비동기 작업 도입 전에 해당 처리가 정말 필요한지, 혹은 배치(Batch) 처리로 대체할 수 없는지 신중하게 검토해야 합니다.

도입

웹 애플리케이션에서 사용자 경험과 시스템 성능을 최적화하기 위해 비동기 작업(Asynchronous Job)의 중요성이 부각되고 있습니다. 본 발표는 웹 서버가 장시간 요청을 처리하기 어려운 근본적인 이유를 설명하고, 이러한 한계를 극복하기 위한 비동기 작업의 필요성을 강조합니다. 특히, 비동기 작업 도입이 시스템에 가져올 복잡성을 인지하고, 신중한 설계 접근 방식이 필요함을 서론에서 다룹니다. 웹 서버의 효율적인 리소스 관리와 응답 시간 보장을 위해 비동기 처리가 왜 필수적인지, 그리고 이를 어떻게 현명하게 도입할지에 대한 전반적인 논의의 장을 마련합니다.

웹 서버의 장시간 요청 처리 한계

대부분의 웹 서버는 요청당 프로세스나 스레드를 할당하여 처리합니다. 동시 처리 가능한 프레임워크 수를 초과하는 요청이 발생하면 대기열에 쌓이게 됩니다. 이때 하나의 요청이 장시간 리소스를 점유하면 전체 서버의 처리 능력이 저하되어 응답 시간이 길어지고, 결국 사용자에게 타임아웃 오류를 발생시키거나 서비스 전체의 장애로 이어질 수 있습니다. 또한, 장시간 요청은 CPU 및 메모리 같은 서버 리소스를 과도하게 사용하거나, 데이터베이스와 같은 미들웨어에 부하를 주어 다른 처리에도 악영향을 미칩니다. HTTP 타임아웃, 처리 중단으로 인한 데이터 불일치, 문제 발생 시 원인 파악의 어려움 등 다양한 운영상의 문제를 야기합니다.

비동기 작업의 필요성 및 도입 고려사항

이러한 장시간 요청 문제를 해결하기 위해 비동기 작업이 도입됩니다. 웹 서버는 처리 시간이 긴 작업을 비동기 시스템에 위임하고 즉시 응답함으로써, 제한된 리소스로 더 많은 요청을 효율적으로 처리할 수 있게 됩니다. 그러나 비동기 작업은 동기 처리보다 시스템을 복잡하게 만들고, 기능 추가, 모니터링, 장애 대응 난이도를 높입니다. 따라서 비동기 작업 도입 전, 해당 기능이 정말 비동기 처리가 필요한지, 혹은 배치(Batch) 처리로 대체할 수 없는지 신중하게 검토해야 합니다. 예를 들어, 실시간성이 중요하지 않은 대량 데이터 분석 기능은 비동기 작업보다 배치 처리로 설계하는 것이 더 단순하고 효율적일 수 있습니다.

비동기 작업 설계 원칙: 짧고 단순하게

Sidekiq의 베스트 프랙티스에서도 강조하듯이, 비동기 작업은 짧고 단순하며 멱등성(Idempotent)과 트랜잭션(Transactional)을 갖추도록 설계해야 합니다. 여기서 ‘짧다’는 수 초 이내에 완료되는 것을 의미합니다. 이 원칙을 따르는 것이 중요한 이유는 다음과 같습니다:

  • 성능 향상: 짧은 작업은 리소스를 빠르게 해제하여 전체 처리량을 높입니다.

  • 재시도 용이성: 단순하고 멱등적인 작업은 실패 시 재시도를 통해 쉽게 복구할 수 있습니다.

  • 모니터링 단순화: 시작 및 종료 이벤트만으로도 처리 시간, 실패율 등을 쉽게 측정할 수 있어 모니터링 시스템을 간소화할 수 있습니다.

  • 배포 및 유지보수 용이성: 짧은 작업은 배포 시 강제 종료될 위험이 적어 안정적인 시스템 운영을 가능하게 합니다.

장시간 비동기 작업 처리 전략

그럼에도 불구하고, 대량 데이터 일괄 처리나 외부 서비스 연동 등 장시간 작업이 불가피한 경우가 있습니다. 이러한 경우, 다음과 같은 전략을 고려할 수 있습니다:

  • 작업 분할 및 재개: Shopify의 Job Iteration, Sidekiq Iteration, Rails 8.1에 도입될 Active Job Continuations과 같은 라이브러리를 활용하여 작업을 작은 단위로 분할하고, 중단 시 이전 상태에서 재개할 수 있도록 합니다.

  • 배치 처리: Sidekiq Pro의 Batches와 같이 여러 작업을 하나의 그룹으로 묶어 관리하며, 각 작업은 짧게 유지하되 전체 진행 상황을 모니터링하고 완료 시 후속 처리를 수행합니다.

  • 외부 서비스 활용: AWS Step Functions와 같은 외부 서비스를 통해 복잡하고 장시간이 소요되는 작업을 비동기 시스템과 분리하여 처리하고, 워크플로우를 관리합니다. 이는 메인 비동기 시스템의 부하를 줄이고 배포 시 안정성을 확보하는 데 도움이 됩니다.

결론

비동기 작업은 웹 애플리케이션의 성능과 확장성을 위한 강력한 도구이지만, 그 도입에는 항상 트레이드오프가 따릅니다. 따라서 비동기 작업을 설계할 때는 '정말 비동기 작업이 필요한가?', '배치 처리로 대체할 수 없는가?', '짧고 단순한 작업으로 만들 수 없는가?'라는 질문을 먼저 던져야 합니다. 가장 이상적인 비동기 작업은 짧고, 단순하며, 멱등성과 트랜잭션 속성을 갖추는 것입니다. 불가피하게 장시간 작업이 필요한 경우에는 Active Job Continuations, Sidekiq Iteration과 같은 전용 라이브러리나 AWS Step Functions와 같은 외부 서비스를 활용하여 안정적인 운영을 위한 전략을 수립해야 합니다. 시스템 설계는 기술적 장단점뿐만 아니라 사용자 경험, 비즈니스 목표, 팀의 역량 등을 종합적으로 고려하는 의사 결정 과정이며, 가장 단순하면서도 효과적인 방법을 지속적으로 탐색하고 개선해 나가는 것이 중요합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!