백그라운드 작업의 공정성: 다중 테넌시 환경에서 대기열 관리 전략

[Euruko 2025] “Prioritization justice: lessons from making background jobs fair at scale”– Alexander

작성자
EuRuKo
발행일
2025년 11월 10일

핵심 요약

  • 1 다중 테넌시 환경에서 백그라운드 작업의 공정성을 확보하기 위한 네 가지 핵심 전략(셔플링, 중단 가능한 반복, 스로틀링, 테넌트별 대기열)을 제시합니다.
  • 2 특히 AI 워크플로우, 대규모 데이터 가져오기 등 무거운 작업에 대해 병목 현상을 최소화하면서 완벽한 공정성을 제공하는 '테넌트별 대기열' 방식의 효과를 강조합니다.
  • 3 Sidekiq과 같은 기존 백그라운드 프로세서의 한계를 극복하고 공정한 대기열 처리를 구현하기 위한 실제적인 팁과 Gem(Sidekick Fair Play)을 소개합니다.

도입

본 발표는 '펜타곤 피자 지수'라는 흥미로운 비유를 통해 백그라운드 작업 처리의 불공정성 문제를 제기합니다. 대규모 주문(예: 펜타곤의 대량 피자 주문)이 일반 고객의 소량 주문을 압도하여 서비스 지연과 고객 불만을 초래하는 상황은, 공유 자원을 사용하는 시스템에서 흔히 발생하는 문제입니다. 특히 First-In, First-Out (FIFO) 방식의 대기열에서 발생하는 높은 지연 시간(latency)은 고객 경험을 저해하고 비즈니스 손실로 이어질 수 있습니다. 본 발표는 이러한 불공정성 문제를 해결하고 모든 사용자에게 공정한 백그라운드 작업 처리 환경을 제공하기 위한 다양한 전략을 모색합니다.

백그라운드 작업의 공정성을 확보하기 위해 기존 프로세서의 한계를 분석하고 네 가지 핵심 전략을 제시합니다. Ruby 개발 환경에서 Sidekiq, SalQ, Good Job과 같은 일반적인 백그라운드 프로세서들은 단순성과 성능에 초점을 맞추어 설계되었기에, 다이내믹하게 변화하는 다중 테넌시 환경의 대기열을 효율적으로 관리하는 데 어려움이 있습니다. 특히 Redis나 관계형 데이터베이스에 대한 빈번한 폴링(polling)은 시스템에 과도한 부하를 줄 수 있습니다. 이에 대한 대안으로 다음과 같은 전략들이 제안됩니다.

공정성을 위한 네 가지 전략

  • 셔플링 (Shuffling): * 여러 개의 고정된 대기열을 생성하고, 고객을 특정 기준(예: 이름 첫 글자)에 따라 결정론적으로 분배하여 각 대기열에 전담 처리자를 할당하는 방식입니다. * 장점: 구현 비용이 매우 저렴하며, 특정 대규모 작업이 전체 시스템을 완전히 블록하는 것을 방지합니다. * 단점: 특정 샤드 내에서는 여전히 블로킹이 발생할 수 있으며, 자원 활용률이 낮아질 수 있습니다. 모든 고객에게 완벽하게 공정하지는 않습니다.
  • 중단 가능한 반복 (Interruptible Iteration): * 하나의 큰 작업을 작은 단위로 나누어 처리하고, 각 단위 처리 후 작업을 대기열의 끝으로 다시 보내는 방식입니다. 이를 통해 다른 고객의 작업이 중간에 처리될 기회를 얻습니다. * 장점: 자원 활용률이 높고 확장성이 좋습니다. 대규모 작업이 다른 작업을 완전히 블록하지 않습니다. Active Job Continuations (Rails 8에 도입)과 같은 기능을 활용할 수 있습니다. * 단점: 동일 고객이 여러 개의 작은 배치 작업을 동시에 생성하면 공정성이 저해될 수 있습니다.
  • 스로틀링 (Throttling): * Leaky Bucket 알고리즘과 같은 방법을 사용하여 특정 고객의 과도한 요청을 감지하고, 이를 일반 대기열이 아닌 별도의 ‘느린 대기열’로 분리하여 처리합니다. * 장점: 완전한 블로킹을 방지하며, 모든 고객이 최소한의 처리 기회를 가집니다. 자원 활용률이 높고 확장성이 뛰어납니다. * 단점: 워크로드가 버스티(bursty)한 특성을 가질 경우, 공정성 문제가 발생할 수 있으며 느린 대기열에 들어간 작업은 처리가 크게 지연될 수 있습니다.
  • 테넌트별 대기열 (Per-Tenant Queues) / 관리자 패턴: * 모든 고객의 작업을 관리자(arbiter)가 소유한 중앙 원장(ledger)에 저장하고, 이 관리자가 메인 작업 대기열로 작업을 공정하게 분배하는 방식입니다. 관리자는 대기열이 비어갈 때마다 원장에서 다음 작업을 가져와 메인 대기열에 넣습니다. * 장점: 완벽한 공정성과 높은 효율성을 제공합니다. 특히 AI 워크플로우, 대규모 데이터 가져오기, 미디어 처리 등 무겁고 지연 시간이 긴 작업에 매우 효과적입니다. * 단점: 관리자 자체가 잠재적인 병목 지점이 될 수 있습니다. 그러나 관리자가 작업을 처리 속도보다 빠르게 메인 대기열에 푸시할 수 있다면 실제 병목은 발생하지 않습니다.

Ruby 개발자를 위한 제안발표자는 개인적인 경험을 바탕으로 ‘테넌트별 대기열’ 전략이 가장 효과적이었음을 강조하며, Sidekiq 환경에서 이를 구현한 Sidekick Fair Play Gem을 소개합니다. 또한 Rails 8에 도입된 Active Job Continuations과 같은 최신 기능을 활용하여 작업을 병렬화하고 지연 시간을 줄이는 것이 중요하다고 언급합니다.

결론

결론적으로, 백그라운드 작업의 공정성을 확보하는 데 있어 단 하나의 만능 해결책은 존재하지 않습니다. 그러나 자원이 제한적이고 지연 시간이 높은 환경에서는 공정성을 고려한 대기열 관리 전략이 필수적입니다. 특히 AI 워크플로우나 대규모 데이터 처리와 같이 무거운 작업에서는 '테넌트별 대기열' 방식이 병목 현상을 최소화하면서도 완벽한 공정성을 제공하는 강력한 솔루션으로 제시됩니다. 개발자들은 `Sidekick Fair Play` Gem과 같은 도구를 활용하거나, Active Job Continuations과 같은 최신 Ruby/Rails 기능을 통해 이러한 전략을 구현하여 고객 만족도를 높이고 비즈니스 연속성을 확보해야 합니다. 이는 단순히 기술적인 문제를 넘어 고객 경험과 비즈니스 성장에 직결되는 중요한 과제입니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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