Sidekiq에서 Solid Queue로 마이그레이션하기

Migrating from Sidekiq to Solid Queue - DONN FELKER

작성자
Ruby on Rails 소식지
발행일
2025년 02월 22일

핵심 요약

  • 1 이 문서는 Ruby on Rails 애플리케이션에서 Sidekiq을 Solid Queue로 마이그레이션하는 실질적인 단계를 상세히 설명합니다.
  • 2 마이그레이션 과정은 Solid Queue 및 Mission Control Jobs 설치, Active Job으로의 코드 전환, 작업 호출 및 재시도 로직 업데이트, 그리고 테스트 코드 수정 등을 포함합니다.
  • 3 이 가이드는 Redis 의존성 제거 및 관계형 데이터베이스 기반의 백그라운드 작업 처리를 통해 확장성과 관리 용이성을 확보하는 방법을 제시합니다.

도입

이 문서는 이메일 마케팅 플랫폼인 Listomo를 Sidekiq에서 Solid Queue로 성공적으로 마이그레이션한 저자의 경험을 바탕으로, Ruby on Rails 애플리케이션에서 백그라운드 작업 처리 시스템을 전환하는 포괄적인 가이드를 제공합니다. 기존 Sidekiq 기반의 시스템을 관계형 데이터베이스 기반의 Solid Queue로 변경함으로써, 특히 대량의 작업 처리가 필요한 경우 데이터베이스를 유연하게 확장/축소할 수 있는 이점을 얻을 수 있습니다. 이 가이드는 기술적인 세부 사항과 함께 실제 마이그레이션 과정에서 발생할 수 있는 문제점과 해결책을 다루며, Sidekiq에서 Solid Queue로의 전환을 고려하는 개발자들에게 실질적인 도움을 제공하는 것을 목표로 합니다.

Sidekiq에서 Solid Queue로의 마이그레이션은 여러 핵심 단계로 구성됩니다. 첫째, bundle add solid_queuebin/rails solid_queue:install 명령을 사용하여 Solid Queue를 설치하고, config/queue.ymldatabase.yml 파일에 큐 관련 설정을 추가해야 합니다. 특히, 프로덕션 환경에서는 큐 데이터베이스를 별도로 구성하여 확장성을 확보하는 것이 중요하며, 클라우드 데이터베이스 제공업체를 사용하는 경우 수동으로 DB를 생성해야 할 수도 있습니다. 둘째, 작업 가시성과 관리를 위해 gem "mission_control-jobs"를 설치하고 config/routes.rbmount MissionControl::Jobs::Engine, at: "/jobs"를 추가하여 작업 대시보드를 설정합니다. 이 URL은 보안에 유의하여 접근을 제한해야 합니다.

코드 변경 측면에서는 기존 Sidekiq 작업을 Active Job 형식으로 전환해야 합니다. 이는 include Sidekiq::Job을 제거하고 ApplicationJob을 상속받도록 변경하며, 큐 설정을 sidekiq_options queue:에서 queue_as로 업데이트하는 것을 포함합니다. 또한, 작업 파일의 위치를 /app/sidekiq에서 Active Job의 기본 위치인 /app/jobs로 이동하는 것이 권장됩니다. 작업 호출 방식도 perform_asyncperform_later로, perform_at.set(...).perform_later로, perform_inlineperform_now로 변경해야 합니다. 대량 작업 처리는 Sidekiq의 perform_bulk 대신 ActiveJob.perform_all_later를 사용하고, 대규모 데이터셋에서는 in_batches 헬퍼와 함께 사용하는 것이 효율적입니다.

사용자 정의 재시도 로직의 경우, Sidekiq의 sidekiq_retry_in을 Active Job의 retry_on StandardError, wait: :polynomially_longer, attempts: 옵션으로 대체하여 지수 백오프(exponential backoff)를 구현할 수 있습니다. 특히 중요한 부분은 테스트 코드 업데이트입니다. Sidekiq의 jobs.size와 같은 헬퍼 대신 ActiveJob::TestHelper가 제공하는 assert_enqueued_jobs, assert_no_enqueued_jobs, enqueued_jobs 등을 사용하여 큐에 들어간 작업을 검증해야 합니다. 견고한 테스트 스위트는 마이그레이션 과정에서 문제점을 신속하게 파악하고 해결하는 데 결정적인 역할을 합니다.

모든 코드 변경 및 테스트가 완료되면, Redis 및 Sidekiq 관련 gem(bundle remove redis, bundle remove sidekiq)과 라우트를 제거할 수 있습니다. 마지막으로, Procfile 또는 서버 설정을 업데이트하여 워커 프로세스가 bundle exec rake solid_queue:start를 통해 Solid Queue를 시작하도록 변경해야 합니다. 이 과정을 통해 Redis 의존성을 완전히 제거하고, 모든 백그라운드 작업이 Solid Queue를 통해 관계형 데이터베이스에서 처리되도록 할 수 있습니다.

결론

Sidekiq에서 Solid Queue로의 마이그레이션은 단순히 백그라운드 큐 시스템을 변경하는 것을 넘어, 애플리케이션의 아키텍처를 현대화하고 확장성을 향상시키는 중요한 단계입니다. Solid Queue는 Redis 없이 PostgreSQL과 같은 관계형 데이터베이스를 사용하여 작업을 관리하므로, SQL을 통해 작업을 직접 쿼리하고, 필요에 따라 큐 데이터베이스를 메인 애플리케이션 데이터베이스와 분리하여 독립적으로 확장할 수 있는 유연성을 제공합니다. 이 마이그레이션은 철저한 계획과 테스트를 통해 원활하게 진행될 수 있으며, 특히 테스트 스위트를 견고하게 구축하는 것이 성공적인 전환의 핵심입니다. 결과적으로, 이 전환은 더 효율적이고 관리하기 쉬운 백그라운드 작업 처리 환경을 구축하는 데 기여합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

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