루비 온 레일즈 Active Job을 위한 Solid Queue: 데이터베이스 기반의 새로운 백엔드 시스템

Rosa Gutiérrez - Solid Queue internals, externals and all the things in between - Rails World 2024 - YouTube

3줄 요약

  • Solid Queue는 Rails 8의 Active Job 기본 백엔드로, 관계형 데이터베이스를 활용하여 기존 시스템의 한계를 극복합니다.
  • `SELECT FOR UPDATE SKIP LOCKED`와 최적화된 테이블 구조를 통해 대규모 작업 처리 시 동시성 문제를 해결하고 효율적인 폴링을 구현합니다.
  • Hey.com에서 하루 2천만 건 이상의 작업을 안정적으로 처리하며 프로덕션 환경에서의 견고함과 성능을 입증했습니다.

발표자는 Rails 8의 Active Job 기본 백엔드로 채택될 Solid Queue를 소개합니다. 이 시스템은 기존 Redis 기반 큐의 한계를 넘어 관계형 데이터베이스를 활용하여 작업 큐를 관리합니다. 발표는 Hey.com 프로덕션에서 겪었던 실제 문제들을 데이터베이스 기반 솔루션으로 해결한 과정을 상세히 설명합니다.

Solid Queue는 여러 핵심 문제를 해결했습니다. 기존 시스템의 워커 사망 시 작업 유실을 방지하고, 수백만 예약 작업을 데이터베이스에 저장하여 메모리 고갈을 해소했습니다. 특히, 다중 워커 환경에서의 데이터베이스 잠금 및 경합 문제는 PostgreSQL의 SELECT FOR UPDATE SKIP LOCKED를 활용, 워커들이 잠기지 않은 행을 건너뛰어 작업을 가져가게 하여 동시성을 크게 향상시켰습니다.

효율적인 폴링을 위해 Solid Queue는 작업 상태에 따라 테이블을 분리하여 핵심 폴링 테이블의 크기를 최소화하고 쿼리 속도를 극대화합니다. 워커 ‘heartbeat’ 및 ‘process registry’를 통해 비정상 종료 워커의 클레임 작업을 자동으로 해제합니다. 순차적 작업(sequential jobs)은 ‘concurrency controls’ 개념으로 발전시켜 작업 큐 추가 시점에 동시성 제한을 확인, 폴링 쿼리 성능에 영향을 주지 않도록 했습니다. 이러한 설계로 하루 2천만 건 이상의 대규모 작업 처리와 낮은 폴링 지연 시간(평균 110 마이크로초)을 달성했습니다. 동시성 제어 작업으로 인한 쓰기 작업 증가 문제 해결을 위해 Solid Queue는 메인 앱 데이터베이스와 분리된 별도 데이터베이스 사용을 권장하며, 이는 Rails 8의 기본 설정이 될 예정입니다.

Solid Queue는 Hey.com과 같은 실제 대규모 프로덕션 환경의 문제들을 해결하며 점진적으로 발전했습니다. 모든 기능은 Hey.com에서 충분히 'battle tested' (발표자 표현으로는 'fun tested') 되어 시스템의 견고함과 신뢰성을 보증합니다. 발표자는 커뮤니티의 기여를 통한 PostgreSQL 및 SQLite 환경 개선을 언급하며, Solid Queue의 지속적인 발전과 안정화를 위한 커뮤니티 참여를 독려합니다. 관계형 데이터베이스의 장점을 활용한 Solid Queue는 Rails 생태계에 안정적이고 확장 가능한 작업 큐 솔루션을 제공하는 중요한 진전입니다.