Ruby on Rails 컨테이너에서 백그라운드 작업 실행
대부분의 애플리케이션은 표준 Rails 요청/응답 주기 이외의 작업을 수행하기 위해 비동기식 또는 백그라운드 프로세스를 필요로 합니다.베어 메탈 서버나 가상 머신에서 크론 시스템 서비스는 역대로 이 목적을 위해 사용되었지만, 몇몇 훌륭한 루비와 Rails 본체 해결 방안은 사용할 수 있다.이러한 기능을 구현할 때 Rails 컨테이너 기반 애플리케이션의 다음 주요 고려 사항에 유의하십시오.
• 컨테이너 환경의 라이프 사이클과 설정이 서로 다릅니다.용기는 빠르게 확대하거나 축소할 수 있기 때문에 더욱 짧다.따라서 프로세스가 중단되거나 여러 복사본을 동시에 실행할 수 있는지 고려해야 합니다.그 밖에 시스템 서비스에 대한 접근은 약간 다르다. 왜냐하면 용기는 하부 호스트 운영체제의 가상화이기 때문이다.
• Rails는 다양한 인프라를 제공하므로 이러한 작업에 사용할 수 있는 많은 애플리케이션 구성 요소를 갖추고 있을 수 있습니다.따라서 이 인프라를 활용하는 것이 큰 장점이다.그에 비해cron 작업은 자신의 단독 환경과 설정을 관리해야 한다.
본고에서 우리는 다음과 같은 Sidekiq와 Cronenberg 등의 도구를 이용한 계획 작업 용례를 연구할 것이다.
계획된 운영 체제 프로세스, 즉 Cron 작업
Dockerfile에서cron을 설정할 수 있지만, Cronenberg을 사용하는 것을 권장합니다. 이것은 Twelve-Factor Application 응용 프로그램을 보충할 수 있는 소프트웨어를 제공합니다.그것은 시스템 서비스로 실행되지 않고 용기의 다른 프로세스로 실행됩니다.그것의 목적은 간단하고 이식이 가능하기 때문에, 하드코딩 위치를crontab 파일의 등가물로 사용하는 것을 피한다.반대로, 설정 파일의 위치가 있는 파라미터를 받아들인다.
컨테이너 환경에서 Cronenberg을 설정하고 사용하려면 세 가지 절차가 있습니다.먼저 설치된 기본 이미지를 사용하거나 명령을 Dockerfile에 추가할 수 있습니다.
RUN wget https://github.com/ess/cronenberg/releases/download/v1.0.0/cronenberg-v1.0.0-linux-amd64 -O /usr/bin/cronenberg && chmod +x /usr/bin/cronenberg
그 다음으로 프로젝트 저장소에 cron-jobs.yml file을 포함한다.다음은 하나의 예다.이것은 Kubernetes 목록보다 훨씬 간단하고, 우리가 자주 사용하는crontab 형식에 가깝다.
# This is just a normal job that runs every minute
- name: hello-world
command: echo "Hello World"
when: "* * * * *"
그리고 다음에 적용되는 옵션을 사용하여cronenberg 자체를 실행합니다.• 로컬 Docker 또는 Kubernetes: Dockerfile 끝에 다음 CMD 추가
CMD cronenberg ./config/cron-jobs.yml
• PaaS(Platform as a Service)를 사용하는 경우 Procfile에 다음 항목을 추가하십시오. cronenberg: cronenberg ./config/cron-jobs.yml
Rails 기반 비동기식 프로세스
Sidekiq은 "간단하고 효율적인 Ruby 백그라운드 프로세싱"으로 표현된 프레임워크Rails와 통합되어 백그라운드 작업을 필요에 따라 또는 계획대로 실행할 수 있습니다.설치와 사용은 확실히 상당히 간단하다.그러나 주의해야 할 구속 중 하나는 Redis를 사용하여 작업 실행을 지속하고 조율하는 것이다.
시작하려면sidekiq와sidekiq 스케줄러gems를 Gemfile에 추가하고 패키지 설치를 실행하십시오
gem 'sidekiq'
gem 'sidekiq-scheduler'
작업 자체는 Sidekiq 로컬 작업자 형식 또는 Rails ActiveJob implementation을 사용하여 수행할 수 있습니다.최신 버전의 Rails(6.x)를 사용하는 경우 대부분의 Sidekiq 기능이 지원됩니다.이 문서에서는 ActiveJob 옵션에 대해 다룹니다.구성/애플리케이션에서rb 파일에 기본 메모리가 아닌 다음 줄을 추가합니다.
class Application < Rails::Application
# ...
config.active_job.queue_adapter = :sidekiq
end
작업 클래스를 직접 만들거나 Rails generate 명령을 사용할 수 있습니다.예를 들어 다음 명령을 사용하여 보고 작업을 시작합니다.bin/rails generate job Report
본고에서 사용한 예시 항목은 실시간 여론조사 응용 프로그램이기 때문에 ReportJob은 전체 여론조사와 개인이 선택한 응답자의 총수를 계산한다.컨테이너 로그 인프라에서 사용할 수 있는 정보를 stdOUT에 기록합니다.클래스에서 작업이 어느 대기열에서 실행되어야 하는지 알려 줍니다.
class ReportJob < ApplicationJob
queue_as :default
# ...
end
Sidekiq는 규범이 없는 상태에서 모든 작업에 기본 대기열을 사용합니다.이것은 다른 작업에 비해 모든 작업이 같은 우선순위로 실행된다는 것을 의미합니다.여러 개의 이름 대기열을 만들고 각 대기열에 우선 순위를 할당할 수 있습니다.이것은 프로필에 정의된 것입니다. 기본적으로 프로필은 config/sidekiq에 있습니다.yml.프로젝트를 위한 프로필을 만들고 싶을 수도 있습니다. 대기열을 만들기 위해서일 뿐만 아니라, Sidekiq 작업을 계획하는 곳이기 때문입니다.주문형 프로세스 실행
일부 용례에서 사용자 조작은 백엔드 작업을 촉발할 것이다.다음 코드를 사용하여 작업을 호출하거나 스케줄링할 수 있습니다.예시 프로그램에서 사용자가 단추를 누르면 보고서를 실행할 때 컨트롤러 동작에서 발생합니다.
ReportJob.perform_later
Sidekiq 구성 파일
sidekiq의 한 예.이름 대기열을 정의한yml 파일은 다음과 같습니다.Sidekiq는 관련 디지털 매개 변수와 같이 높은 우선 순위 대기열의 작업 빈도를 낮은 우선 순위 대기열의 두 배로 폴링합니다.예를 들어 이 값이 4이면 대기열의 작업 처리 빈도가 낮은 우선순위 대기열의 4배임을 나타낸다.
--------
:verbose: false
:concurrency: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
:timeout: 30
:queues:
- [low_priority, 1]
- [high_priority, 2]
Redis 스토리지
Sidekiq는 Redis에 정보를 저장하여 여러 클라이언트 간의 계획 작업, 상태 및 조정을 지원합니다.개발의 경우 다음 명령을 사용하여 로컬 Docker 컨테이너를 실행할 수 있습니다.기본적으로 Sidekiq는 표준 포트를 사용하여 localhost에서 Redis를 찾습니다.
docker run -it --rm -p 6379:6379 --name redis -d redis redis-server --appendonly yes
로컬 용기를 시작하거나 닫는 과정에서redis 데이터를 유지하려면, 메모리 디렉터리를 로컬 호스트 파일 시스템에 비추기 위해 docker run 명령에 다음 인자를 추가하십시오.-v /path/to/your/app/storage/redis:/data
생산 환경에서, 당신은 배열 프레임워크를 사용하거나 PaaS 플랫폼의 설명에 따라 Redis 용기를 실행해야 합니다.예를 들어, provision Redis on Engine Yard Kontainers을 만드는 방법은 다음과 같습니다.Sidekiq가 연결될 수 있도록 Redis의 위치를 구성해야 합니다.컨테이너에서 일반적으로 이 작업은 REDIS URL 환경 변수를 사용하여 수행됩니다.Engine Yard Kontainers에서는 다음 명령을 사용하여 설정합니다.eyk config:set REDIS_URL=redis://your.redis.host:6379
심부름
앞에 Ruby 애플리케이션에서 작업을 호출하거나 스케줄링하는 데 사용되는 코드가 나와 있습니다.이것은 작업 요청을 대기열에 넣지만, 실제 Sidekiq 프로세스가 대기열에서 작업을 읽고 실행해야 합니다.다음 옵션을 사용하여 Sidekiq 프로세스를 수행할 수 있습니다.
• 로컬 Docker 또는 Kubernetes: Dockerfile 끝에 다음 내용 추가
CMD bundle exec sidekiq
• Engine Yard과 같은 플랫폼-서비스(PaaS)를 사용하는 경우 Procfile에 다음 항목을 추가합니다. sidekiq: bundle exec sidekiq
백그라운드 작업 예약
이미 알고 있는 주기적인 프로세스 호출에 대해sidekiq 스케줄링 작업을 사용할 수 있습니다.yml 파일.이것은crontab 항목을 설정하는 것과 같습니다.아래는 벽감이다.보고서 작업을 시간당 1분으로 설정하는 데 사용되는 yml 파일입니다.
--------
:verbose: false
:concurrency: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
:timeout: 30
:queues:
- default
:schedule:
ReportJob:
cron: '1 * * * *'
queue: default
enabled: true
Sidekiq 네트워크 콘솔
Sidekiq는 작업을 보고 관리할 수 있는 대시보드를 제공합니다.추가는 간단합니다. 아래의 Require 문장을 추가하여 루트에 불러오기만 하면 됩니다.rb 파일.
require 'sidekiq/web'
require 'sidekiq-scheduler/web'
Rails.application.routes.draw do
# ...
mount Sidekiq::Web => '/sidekiq'
end
다음은 Sidekiq 대시보드의 화면 캡처입니다.오류 처리 및 재시도 메커니즘
분포식 시스템은 간헐적으로 실패하고, 때로는 재미있는 방식으로 실패할 수도 있다는 것을 우리는 모두 알고 있다.재시도 메커니즘을 사용하여 이 장면들을 기획하다.다음 코드 세션은 특정 오류를 처리하는 예시를 제공합니다.
복구 가능한 오류를 고려하고 다시 시도할 가치가 있으며, 어떤 오류는 지표만 발표하면 경보를 울릴 수 있다.복구할 수 없는 오류에서 재시도를 시도하면 재시도 폭풍만 발생하고 시스템의 다른 부분에 문제가 발생할 수 있습니다.
재시도 횟수를 지정하려면 작업 클래스에서 다음 코드를 사용하십시오.
class ExampleJob < ActiveJob::Base
retry_on ErrorLoadingSite, wait: 5.minutes, queue: :low_priority
def perform(*args)
# Perform Job
end
end
크기 조정 및 기타 디자인 고려 사항
설계 계획 작업을 할 때 반드시 다음과 같은 사항을 고려해야 한다.
• Sidekiq 또는 Cronenberg 컨테이너를 자동으로 크기 조절해야 하는지 고려합니다.일반적인 구성은 배율을 1로 설정하는 것입니다.만약 당신의 일이 멱이 아니거나 논쟁을 피해야 한다면 이것은 좋은 방법입니다.만약 이러한 문제가 없고 신축성을 이용할 수 있다면 반드시 이 용기들의 잠재력을 충분히 이용해야 한다.
• 많은 계획 프로세스가 차지하는 자원이 매우 적기 때문에 관련 작업을 이 용기에 포장하여 인프라 자원을 가장 효과적으로 사용할 수 있도록 고려해 주십시오.
이 블로그는 devgraph.com에 처음 게시되었습니다.
Reference
이 문제에 관하여(Ruby on Rails 컨테이너에서 백그라운드 작업 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/devgraph/running-background-jobs-in-ruby-on-rails-containers-535c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)