Rails 8의 Solid Queue 소개: 데이터베이스 기반 백그라운드 작업의 새로운 기준

An Introduction to Solid Queue for Ruby on Rails

작성자
발행일
2025년 05월 07일

핵심 요약

  • 1 Rails 8에 새로 추가된 Solid Queue는 Redis와 같은 추가 인프라 없이 데이터베이스만을 사용하여 백그라운드 작업을 처리합니다.
  • 2 Solid Queue는 FOR UPDATE SKIP LOCKED를 활용한 효율적인 테이블 폴링과 supervisor 프로세스를 통한 작업 유실 방지로 높은 성능과 안정성을 제공합니다.
  • 3 ActiveRecord 모델인 Job과 실제 작업을 수행하는 Worker로 구성되며, 여러 테이블을 사용하여 작업의 생명 주기를 관리합니다.

도입

Rails 8에 새롭게 추가된 Solid Queue는 백그라운드 작업 처리를 위한 라이브러리로, Rails 애플리케이션의 운영 오버헤드를 줄이려는 37Signals의 노력의 일환으로 탄생했습니다. 기존의 Sidekiq나 Resque와 같은 큐 시스템이 Redis와 같은 추가 인프라를 필요로 했던 것과 달리, Solid Queue는 오직 데이터베이스만을 사용하여 작동합니다. 이는 Rails 7에서 SQLite를 프로덕션 기본 데이터베이스로 채택한 기조와 일맥상통하며, 추가적인 종속성 없이 백그라운드 작업을 처리할 수 있는 강력한 대안을 제시합니다. 본 글에서는 Solid Queue의 내부 아키텍처, 독특한 특징, 그리고 개발 배경을 심층적으로 탐구합니다.

Solid Queue는 Jobs와 Workers라는 두 가지 주요 구성 요소로 이루어져 있습니다.

Solid Queue 아키텍처

  • Jobs: ActiveRecord 모델로, 사용자가 상호작용하는 부분입니다. Job.perform_later와 같이 작업을 큐에 추가하는 메서드를 정의합니다.

  • Workers: 실제 작업을 수행하는 요소로, 애플리케이션 설정에 따라 백그라운드 프로세스로 생성됩니다.

  • 데이터베이스: Jobs와 Workers를 연결하는 핵심 요소이며, Solid Queue의 모든 작업은 다양한 데이터베이스 테이블을 통해 이루어집니다.

작업 생명 주기 및 성능 최적화

작업이 큐에 추가되면 solid_queue_jobs 테이블에 레코드가 생성됩니다. 즉시 실행될 작업은 solid_queue_ready_executions 테이블에도 추가됩니다.

  • 폴링 효율성: Workers는 solid_queue_jobs 대신 크기가 작은 solid_queue_ready_executions를 폴링하여 성능을 향상시킵니다.

  • 동시성 처리: PostgreSQL 9.5 이상 및 MySQL 8.0 이상에서 지원되는 FOR UPDATE SKIP LOCKED 구문을 사용하여, 한 Worker가 작업을 잠그는 동안 다른 Worker들이 테이블의 나머지 부분을 동시에 폴링할 수 있도록 하여 병목 현상을 방지합니다. SQLite는 이 기능을 지원하지 않아 Worker들이 순차적으로 대기해야 합니다.

작업 유실 방지 (Safety First)

Solid Queue는 작업 유실을 방지하기 위한 강력한 안전 장치를 갖추고 있습니다.

  • 작업 Claim: Worker가 작업을 시작할 때 solid_queue_claimed_executions 테이블에 레코드를 생성하고 solid_queue_jobs 테이블의 claimed 플래그를 설정합니다.

  • 프로세스 관리: 각 Worker 프로세스는 solid_queue_processes 테이블에 자신의 레코드를 생성하고 last_heartbeat_at을 주기적으로 업데이트합니다.

  • Supervisor 역할: 백그라운드에서 실행되는 Supervisor 프로세스는 solid_queue_processes 테이블을 모니터링하여 last_heartbeat_at이 임계값(기본 5분)보다 오래된 Worker를 감지합니다. 문제가 발생한 Worker의 레코드를 삭제하고, 해당 Worker가 Claim했던 작업을 다시 ‘잡을 수 있는(up-for-grabs)’ 상태로 만들어 다른 Worker가 처리할 수 있도록 합니다. 이를 통해 작업이 영구적으로 멈추는 상황을 방지합니다.

결론

Solid Queue는 Rails 8의 중요한 추가 기능으로, 데이터베이스만을 활용하여 백그라운드 작업을 효율적이고 안정적으로 처리하는 새로운 패러다임을 제시합니다. Jobs와 Workers의 아키텍처, `solid_queue_ready_executions`를 통한 성능 최적화, 그리고 `FOR UPDATE SKIP LOCKED`를 활용한 동시성 확보는 물론, Supervisor 프로세스를 통한 작업 유실 방지 메커니즘은 Solid Queue가 대규모 프로덕션 시스템에서도 충분히 경쟁력 있는 선택지가 될 수 있음을 보여줍니다. 추가 종속성 없이 Rails 애플리케이션의 운영 복잡성을 줄이고자 하는 목표를 달성하며, 향후 예정된 고급 기능들을 통해 그 활용도는 더욱 확장될 것으로 기대됩니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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