https://github.com/collectiveidea/delayed_job에서 이것을보고 있다면 마스터 브랜치의 문서를 읽고 있습니다. 최신 릴리스 (4.1.13)에 대한 설명서를보십시오.
지연 :: 작업 (또는 DJ)은 백그라운드에서 더 긴 작업을 비동기 적으로 실행하는 일반적인 패턴을 캡슐화합니다.
작업 테이블이 다양한 핵심 작업을 담당하는 Shopify에서 직접 추출 한 것입니다. 이러한 작업 중에는 다음과 같습니다.
대규모 뉴스 레터 보내기
이미지 크기 조정
HTTP 다운로드
스마트 컬렉션 업데이트
제품 변경 후 검색 서버 인 Solr 업데이트
배치 수입
스팸 확인
트위터에서 우리를 팔로우하여 새로운 릴리스에 대한 업데이트와 통지를 받으십시오.
Delayed_Job 3.0.0은 Rails 3.0+ 만 지원합니다.
Delayed_Job은 작업 대기열을 저장하기위한 여러 백엔드를 지원합니다. 다른 백엔드는 위키를 참조하십시오.
활성 레코드와 함께 Delayed_job을 사용하려면 Gemfile
에 delayed_job_active_record
추가하십시오.
gem 'Delayed_job_active_record'
Mongoid와 함께 Delayed_job을 사용하려는 경우 Gemfile
에 delayed_job_mongoid
추가하십시오.
gem 'Delayed_job_mongoid'
bundle install
실행하여 백엔드 및 Delayed_job 보석을 설치하십시오.
활성 레코드 백엔드에는 작업 테이블이 필요합니다. 다음 명령을 실행하여 해당 테이블을 만들 수 있습니다.
rails generate delayed_job:active_record rake db:migrate
레일 4.2+는 아래를 참조하십시오
개발 모드에서 Rails 3.1+를 사용하는 경우 애플리케이션 코드는 100 개의 작업마다 또는 대기열이 완료 될 때 자동으로 다시로드됩니다. 개발 중에 코드를 업데이트 할 때마다 지연된 작업을 더 이상 다시 시작할 필요가 없습니다.
Rails 4.2+에서 queue_adapter를 config/application.rb에 설정하십시오
config.active_job.queue_adapter = : Delayed_job
자세한 내용은 Rails 가이드를 참조하십시오.
Protected_attributes gem을 사용하는 경우 gemfile에서 Delayed_job 전에 나타나야합니다. 일자리가 실패한 경우 :
ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "handler" violates not-null constraint
그러면 이것이 당신이 찾고있는 수정입니다.
지연된 작업 3.0.0은 Delayed_Jobs 테이블에 새 열을 소개합니다.
지연된 작업 2.X에서 업그레이드하는 경우 업그레이드 생성기를 실행하여 마이그레이션을 만들어 열을 추가하십시오.
rails generate delayed_job:upgrade rake db:migrate
모든 객체에 .delay.method(params)
호출하면 백그라운드에서 처리됩니다.
# [email protected]! (@device)# 지연 [email protected]! (@device)
메소드가 항상 백그라운드에서 실행되어야하는 경우 메소드 선언 후에 #handle_asynchronously
호출 할 수 있습니다.
클래스 장치 DEF 제공# Long Running Method 끝 핸들 _asynchronously : DeliverendDevice = device.newdevice.deliver
#handle_asynchronously
및 #delay
이 매개 변수를 가져옵니다.
:priority
(번호) : 더 낮은 숫자는 먼저 실행됩니다. 기본값은 0이지만 재구성 할 수 있습니다 (아래 참조)
:run_at
(시간) :이 시간 이후에 작업을 실행하십시오 (아마도 미래에)
:queue
(String) : 우선 순위에 대한 대안 인이 작업을 입력하기위한 큐어 (queue) (아래 참조)
이 매개 변수는 PROC 객체 일 수 있으므로 값을 호출 시간 평가할 수 있습니다.
예를 들어:
클래스 Longtasks def send_mailer# 다른 코드 끝 핸들 _asynchronously : send_mailer, : 우선 순위 => 20 def in_the_future# 다른 코드 끝 # 5.minutes.from_now는 in_the_future가 호출되면 평가됩니다 hands_asynchronously : in_the_future, : run_at => proc.new {5.minutes.from_now} def self.when_to_run2.hours.from_now 끝 클래스 << selfdef call_a_class_method # 다른 codeendhandle_asynchronously : call_a_class_method, : run_at => proc.new {when_to_run} 끝 Att_Reader : How_important def call_an_instance_method# 다른 코드 끝 hands_asynchronously : call_an_instance_method, : priority => proc.new {| i | I. How_important} 끝
예를 들어 콘솔에서 무언가를 디버깅하는 동안 handle_asynchronously
'd 메소드를 호출하려면 _without_delay
메소드 이름에 추가하십시오. 예를 들어, 원래 방법이 foo
인 경우 foo_without_delay
로 전화하십시오.
지연된 구직은 Rails 메일러에 특수 구문을 사용합니다. .delay
사용할 때 .deliver
메소드를 호출하지 마십시오.
# Delayed_jobnotifier.signup (@user) .deliver# with Delayed_jobnotifier.delay.signup (@user)# 지연된_job (특정 timenotifier.delay)에서 실행중인 Delayed_job (run_at : 5.minutes.from_now). , .with 메소드는 .Delay MethodNotifier.with (foo : 1, bar : 2) .delay.signup (@user) 전에 호출해야합니다.
편리한 .deliver_later
구문을 제공하는 Action Mailer와 함께 활성 작업을 사용하는 것을 고려할 수도 있습니다.
DJ 3은 DJ 스타일 우선 순위를 유지하면서도 RESQUE 스타일의 이름이 지정된 큐를 소개합니다. 목표는 별도의 근로자 풀이 작업 할 수있는 시스템을 제공하는 것입니다. 개별적으로 조정되고 제어 될 수 있습니다.
queue
옵션을 설정하여 작업을 대기열에 할당 할 수 있습니다.
Object.Delay (: queue => '추적'). MethodDelayed :: job.enqueue job, : queue => 'Tracking'Handle_Asynchronously : tweet_later, : queue =>'tweets '
이름이 지정된 대기열의 기본 우선 순위를 구성 할 수 있습니다.
지연 :: Worker.queue_attributes = { High_Priority : {우선 순위 : -10}, Low_Priority : {우선 순위 : 10}}
지연 방법에 우선 순위를 전달하면 구성된 큐 우선 순위를 재정의 할 수 있습니다.
Object.delay (: queue => 'high_priority', 우선 순위 : 0) .method
아래 정의 된 queue
및 queues
옵션으로 특정 대기열 만 작동하도록 프로세스를 시작할 수 있습니다. 대기열을 지정하지 않고 시작된 프로세스는 모든 대기열에서 작업을 실행합니다. 대기열이 지정되지 않은 작업을 실행하는 프로세스를 효과적으로 사용하려면 Delayed::Worker.default_queue_name
기본 대기열 이름을 설정하고 프로세스를 해당 큐를 실행하도록하십시오.
script/delayed_job
사용하여 작업을 시작하는 배경 프로세스를 관리 할 수 있습니다.
그렇게하려면 gem "daemons"
Gemfile
에 추가하고 rails generate delayed_job
하십시오.
그런 다음 다음을 수행 할 수 있습니다.
RAILS_ENV=production script/delayed_job start RAILS_ENV=production script/delayed_job stop # Runs two workers in separate processes. RAILS_ENV=production script/delayed_job -n 2 start RAILS_ENV=production script/delayed_job stop # Set the --queue or --queues option to work from a particular queue. RAILS_ENV=production script/delayed_job --queue=tracking start RAILS_ENV=production script/delayed_job --queues=mailers,tasks start # Use the --pool option to specify a worker pool. You can use this option multiple times to start different numbers of workers for different queues. # The following command will start 1 worker for the tracking queue, # 2 workers for the mailers and tasks queues, and 2 workers for any jobs: RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start # Runs all available jobs and then exits RAILS_ENV=production script/delayed_job start --exit-on-complete # or to run in the foreground RAILS_ENV=production script/delayed_job run --exit-on-complete
레일 4 : 스크립트/Delayed_Job을 BIN/DELADED_JOB로 교체하십시오
작업자는 데이터베이스에 액세스하고 시계가 동기화되는 한 모든 컴퓨터에서 실행할 수 있습니다. 각 작업자는 적어도 5 초마다 데이터베이스를 확인합니다.
또한 rake jobs:work
불러 일으킬 수도 있습니다. CTRL-C
로 레이크 작업을 취소 할 수 있습니다.
사용 가능한 모든 작업을 실행하고 종료하려면 rake jobs:workoff
사용할 수 있습니다.
QUEUE
또는 QUEUES
환경 변수를 설정하여 대기열을 해결하십시오.
QUEUE=tracking rake jobs:work QUEUES=mailers,tasks rake jobs:work
다음 구문은 지연된 작업을 다시 시작합니다.
RAILS_ENV=production script/delayed_job restart
다수의 Delayed_job 근로자를 다시 시작하려면 :
RAILS_ENV=production script/delayed_job -n2 restart
레일 4 : 스크립트/Delayed_Job을 BIN/DELADED_JOB로 교체하십시오
작업은 Perform이라는 메소드가있는 간단한 루비 객체입니다. 수행에 응답하는 모든 객체는 작업 테이블에 채워질 수 있습니다. 작업 개체는 Yaml로 직렬화되어 나중에 작업 주자가 부활 할 수 있습니다.
NewsletterJob = struct.new (: text, : emails) do def performails.each {| e | Newslettermailer.deliver_text_to_email (Text, e)} EndendDelayed :: job.enqueue Newsletterjob.new ( 'Lorem ipsum ...', customer.pluck (: email)))
지연된 최대 최대 시도를 설정하려면 지연된 :: worker.max_attempts 작업에서 max_attempts 메소드를 정의 할 수 있습니다.
NewsletterJob = struct.new (: text, : emails) do def performails.each {| e | Newslettermailer.deliver_text_to_email (Text, e)} 끝 def max_attempts3 견디다
지연된 조브 마스 런 타임을 설정하려면 지연된 다음 :: worker.max_run_time 작업에서 max_run_time 메소드를 정의 할 수 있습니다.
참고 : 이것은 지연된 것보다 낮은 max_run_time을 설정하는 데만 사용할 수 있습니다 :: worker.max_run_time. 그렇지 않으면 직업의 자물쇠가 만료되고 다른 근로자는 진행중인 작업을 시작합니다.
NewsletterJob = struct.new (: text, : emails) do def performails.each {| e | Newslettermailer.deliver_text_to_email (Text, e)} 끝 def max_run_time120 # 초 견디다
지연된 작업을 파괴하기 위해 JOB 당 기본값을 설정하여 다음 :: worker.destroy_failed_jobs를 정의 할 수 있습니까? 작업에 대한 방법
NewsletterJob = struct.new (: text, : emails) do def performails.each {| e | Newslettermailer.deliver_text_to_email (Text, e)} 끝 def destrove_failed_jobs? false 견디다
지연된 사용자 정의 작업의 기본 대기열 이름을 설정하려면 :: worker.default_queue_name이 작업에서 queue_name 메소드를 정의 할 수 있습니다.
NewsletterJob = struct.new (: text, : emails) do def performails.each {| e | Newslettermailer.deliver_text_to_email (Text, e)} 끝 def queue_name'newsletter_queue ' 견디다
오류가 발생하면 작업이 5 초 + N ** 4로 다시 예정되어 있으며 여기서 N은 시도 횟수입니다. 이 기본 동작을 무시하기 위해 자신의 reschedule_at
메소드를 정의 할 수 있습니다.
NewsletterJob = struct.new (: text, : emails) do def performails.each {| e | Newslettermailer.deliver_text_to_email (Text, e)} 끝 def reschedule_at (current_time, 시도) current_time + 5.seconds 견디다
프로세스에서 다른 단계에서 호출되는 작업의 후크를 정의 할 수 있습니다.
참고 : ActiveJob을 사용하는 경우 이러한 후크는 작업에 사용할 수 없습니다 . ActiveJob의 콜백을 사용해야합니다. https://guides.rubyonrails.org/active_job_basics.html#callbacks에서 자세한 내용을 찾을 수 있습니다
클래스 ParanoidnewsletterJob <NewsletterJob def enqueue (직업) record_stat 'Newsletter_job/enqueue' 끝 def performails.each {| e | Newslettermailer.deliver_text_to_email (Text, e)} 끝 def 이전 (job) record_stat 'Newsletter_Job/start' 끝 Def After (Job) Record_stat 'Newsletter_Job/After' 끝 DEF 성공 (직업) Record_Stat 'Newsletter_Job/Success' 끝 DEF 오류 (작업, 예외) AirBrake.Notify (예외) 끝 DEF 실패 (작업) page_sysadmin_in_the_middle_of_the_night 견디다
라이브러리는 다음과 같이 보이는 Delayed_jobs 테이블을 중심으로 진행됩니다.
Create_table : Delayed_jobs, : force => true do | 테이블 | table.integer : 우선 순위, : default => 0 # 일부 작업은 큐 앞쪽으로 점프 할 수 있습니다. table.integer : 시도, : default => 0 #은 재시도를 제공하지만 결국에는 실패합니다. table.text : handler # yaml- 인코딩 된 객체의 문자열이 작동합니다. table.text : last_error # 마지막 실패의 이유 (아래 참고 참조) TABLE.DATETIME : run_at # 실행 시점. 시간이 될 수 있습니다. Zone.now는 즉시 또는 미래에 언젠가. table.dateTime : locked_at # 클라이언트 가이 개체에서 작업 할 때 설정 table.dateTime : 실패 # # 모든 재생산이 실패한 경우 설정 (실제로 기본적으로 레코드가 삭제됩니다) Table.String :이 개체를 작업중인 Locked_By # (잠금되는 경우) Table.String : 대기열 #이 작업이있는 대기열의 이름 TALK.TIMESTAMPSEND
오류가 발생하면 작업은 5 초 + n ** 4로 다시 예약되며, 여기서 n은 시도 횟수 또는 작업의 정의 된 reschedule_at
메소드를 사용하는 것입니다.
Default Worker.max_attempts
는 25입니다.이 후에 작업이 삭제되거나 (기본값) "실패한"세트가있는 데이터베이스에 남아 있습니다. 기본값이 25 번의 시도로 마지막 재 시도는 20 일 후에, 마지막 간격은 거의 100 시간입니다.
기본 Worker.max_run_time
은 4. 시간입니다. 작업이 그보다 오래 걸리면 다른 컴퓨터를 선택할 수 있습니다. 이번에는 직업이 초과되지 않도록하는 것은 당신에게 달려 있습니다. 당신은 이것을 당신이 일을 할 수 있다고 생각하는 가장 긴 시간으로 설정해야합니다.
기본적으로 실패한 작업을 삭제하고 항상 성공적인 작업을 삭제합니다). 실패한 작업을 유지하려면 Delayed::Worker.destroy_failed_jobs = false
설정하십시오. 실패한 작업에는 Nuln Null Failed_at가 표시됩니다.
기본적으로 모든 작업은 priority = 0
으로 예약되며 이는 최우선 과제입니다. Delayed::Worker.default_priority
을 설정하여 다음을 변경할 수 있습니다. 낮은 숫자는 우선 순위가 높습니다.
기본 동작은 사용 가능한 작업을 찾을 때 대기열에서 5 개의 작업을 읽는 것입니다. Delayed::Worker.read_ahead
설정하여이를 구성 할 수 있습니다.
기본적으로 모든 작업은 이름이 지정된 대기열없이 대기됩니다. 기본적으로 명명 된 큐는 Delayed::Worker.default_queue_name
사용하여 지정할 수 있습니다.
일자리가 없으면 작업자는 수면 지연 옵션으로 지정된 시간 동안 잠을 자게됩니다. Delayed::Worker.sleep_delay = 60
.
테스트 목적으로 지연된 작업을 비활성화 할 수 있습니다. Delayed::Worker.delay_jobs = false
.
또는 Delayed::Worker.delay_jobs
Job별로 인라인으로 작업을 실행할 것인지 결정하는 Proc 일 수 있습니다.
지연 :: Worker.delay_jobs = -> (job) { job.queue! = 'Inline'}
sigterm 신호에 대한 예외를 제외해야 할 수도 있습니다. Delayed::Worker.raise_signal_exceptions = :term
인해 작업자가 실행 업무 SignalException
중단하고 잠금 해제하게하여 다른 작업자가 작업을 사용할 수있게합니다. 이 옵션의 기본값은 False입니다.
다음은 레일에서 작업 매개 변수 변경의 예입니다.
# config/initializers/delayed_job_config.rbdelayed :: worker.destroy_failed_jobs = falsedelayed :: worker.sleep_delay = 60delayed :: worker.max_attempts = 3delayed :: worker.max_run_time = 5.mineSdelayed :: shorkEdeDEDER ault_queue_name = 'default'delayed :: worker.delay_jobs =! rails.env.test? 지연 :: worker.raise_signal_exceptions = : termdelayed :: worker.logger = logger.new (file.join (rails.root,'log ',' Delayed_Job.log '))
rake jobs:clear
.
도움을 받기에 좋은 곳은 다음과 같습니다.
메일 링리스트에 가입 할 수있는 Google 그룹.
stackoverflow