본문으로 건너뛰기

Rails 8.1 Job Continuations: 배포 중단 없이 백그라운드 작업을 재개하는 방법

Rails 8.1 Job Continuations—Resume Jobs After Deploy Without Restarting | Write A Catalyst

작성자
알 수 없음
발행일
2026년 02월 10일

핵심 요약

  • 1 Rails 8.1에서 도입된 Job Continuations 기능을 사용하면 배포 시 중단된 백그라운드 작업을 처음부터 다시 시작하지 않고 마지막 체크포인트부터 재개할 수 있습니다.
  • 2 continuable! 선언과 checkpoint! 메서드를 활용해 작업 상태를 큐 저장소에 스냅샷으로 저장함으로써 데이터 불일치 문제를 방지하고 재처리 효율성을 극대화합니다.
  • 3 Kamal과 같은 배포 도구의 프리-스톱 및 포스트-스타트 훅을 설정하여 SIGTERM 신호 발생 시 상태를 저장하고 새 컨테이너에서 즉시 작업을 이어가도록 구현 가능합니다.

도입

Rails 8.1은 백그라운드 작업의 안정성을 획기적으로 향상시키는 'Job Continuations' 기능을 도입했습니다. 기존의 블루-그린 또는 롤링 배포 방식은 웹 요청은 안전하게 보호하지만, 실행 중인 백그라운드 작업은 강제로 종료되어 재처리가 필요하거나 데이터 왜곡이 발생하는 한계가 있었습니다. 이 기능은 ActiveJob에 체크포인트 시스템을 추가하여 작업 진행 상태를 보존하고, 새 컨테이너가 부팅된 후 중단된 지점부터 즉시 재개할 수 있도록 지원합니다. 이는 특히 실행 시간이 긴 배치 작업이나 ETL 프로세스에서 발생할 수 있는 리소스 낭비를 방지하는 데 핵심적인 역할을 합니다.

1. ActiveJob Continuable의 핵심 개념

Job Continuations는 작업에 소형 상태 머신을 추가하는 방식입니다. 특정 작업을 continuable로 선언하고 안전한 경계 지점에 checkpoint를 배치하면, 런타임이 인자, 마지막 체크포인트 레이블, 최소한의 로컬 변수를 포함한 압축된 스냅샷을 큐 저장소에 저장합니다. 종료 신호(SIGTERM)가 발생하면 작업은 처음부터 다시 시작하는 대신 최신 체크포인트에서 재개됩니다.

  • 명시적 선택(Opt-in): 모든 작업이 아닌 continuable!로 마킹된 작업만 참여합니다.
  • 구조적 멱등성: 체크포인트는 개발자가 단계를 명확한 입력과 출력을 가진 순수 연산에 가깝게 설계하도록 유도합니다.
  • 저장소 호환성: Solid Queue, Sidekiq 등 작은 페이로드를 저장할 수 있는 어댑터와 함께 작동합니다.

2. 구현 방법 및 코드 예시

설정 파일에서 기능을 활성화한 후, 작업 클래스 내에서 체크포인트를 설정합니다. 주로 I/O 경계나 루프의 청크 단위에 배치하는 것이 권장됩니다.

```ruby # config/initializers/continuations.rb Rails.application.configure do config.active_job.continuations.enabled = true config.active_job.continuations.ttl = 24.hours end

app/jobs/reindex_catalog_job.rb

class ReindexCatalogJob < ApplicationJob continuable!

def perform(store_id) checkpoint! :load_ids do @ids = Product.where(store_id: store_id).pluck(:id) end

checkpoint_each :batch, @ids.each_slice(500) do |batch|
  Search::Client.bulk_index(batch)
end   end end ```

3. 배포 도구와의 통합 (Kamal)

Kamal을 사용하면 워커를 완전히 비우지(drain) 않고도 안전하게 배포할 수 있습니다. 컨테이너가 중단되기 전 훅을 통해 상태를 저장하고, 새 컨테이너 시작 시 재개 명령을 실행합니다.

  • Pre-stop: bin/rails jobs:continuations:checkpoint를 호출하여 실행 중인 작업의 스냅샷을 찍습니다.
  • Post-start: bin/rails jobs:continuations:resume을 호출하여 새 환경에서 작업을 다시 시작합니다.

4. 성능 및 주의 사항

체크포인트는 직렬화로 인해 약간의 오버헤드를 발생시키지만, 재작업을 제거함으로써 얻는 이득이 더 큽니다.

  • 성능: 일반 실행 시 오버헤드는 0~2% 수준이며, 루프 체크포인트 사용 시 약 3~6% 정도의 부하가 발생합니다.
  • 상태 관리: 대규모 객체를 스냅샷에 저장하지 말고, ID와 같은 최소한의 데이터만 유지해야 합니다.
  • 멱등성 확보: 외부 API 호출과 같은 사이드 이펙트가 있는 단계는 멱등성 키를 사용하거나 업서트(upsert) 방식을 활용하여 중복 처리를 방지해야 합니다.

결론

Rails 8.1의 Job Continuations는 백그라운드 작업 영역에서도 진정한 의미의 '제로 다운타임'을 실현하게 해줍니다. 비록 체크포인트 설정 시 약간의 직렬화 오버헤드가 발생할 수 있으나, 재작업 방지를 통한 전체적인 처리량 이득과 데이터 무결성 확보라는 측면에서 그 가치가 매우 큽니다. 특히 대규모 데이터 처리나 외부 API 연동 작업이 많은 서비스에서 배포 안정성을 확보하는 데 필수적인 도구가 될 것입니다. 개발자는 멱등성을 고려한 체크포인트 설계와 적절한 모니터링을 통해 시스템의 견고함을 한 단계 더 높일 수 있습니다.

댓글 0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

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