2017-02-01 6 views
0

나는 Heroku에서 resque를 사용했는데, 때때로 SIGTERM으로 작업을 중단합니다.복잡한 작업에서 resque-status로 SIGTERM을 처리하는 방법

은 지금까지 나는 간단한 이것을 처리했습니다

우리는 우리가 작업을 추적 할 수 있도록 resque-상태를 사용하기 시작했습니다
def process(options) 
    do_the_job 
rescue Resque::TermException 
    self.defer options 
end 

하지만, 분명히 위의 방법은 휴식이 작업 윌 실제로 다른 작업으로 연기되었을 때 완료되었습니다.

현재 생각해 보면 resque에서 현재 작업을 지연하는 대신 SIGTERM으로 인해 실패한 작업을 다시 대기시키는 다른 작업이 있어야합니다.

트릭은 몇 가지 작업이 더 복잡 점에서 온다 :

def process(options) 
    do_part1 unless options['part1_finished'] 
    options['part1_finished'] 
    do_part2 
rescue Resque::TermException 
    self.defer options 
end 

는 단순히 구조를 제거하고 do_part1이 반복됩니다 때 간단하게 재 시도하는 작업이 예외가 발생합니다.

답변

0

resque-status가 작동하는 방식을 자세히 살펴보면 resque-status가 사용할 동일한 매개 변수를 사용하여 대기열에 대해 다시 대기열로 바뀔 수 있습니다.

def process 
    do_part1 unless options['part1_finished'] 
    options['part1_finished'] 
    do_part2 
rescue Resque::TermException 
    Resque.enqueue self.class, uuid, options 
    raise DeferredToNewJob 
end 

는 물론, 이것은 너무 resque-상태의 향후 버전과 호환되지 않을 수 있습니다 문서화된다.

작업이 실패하고 새 작업을 선택하는 사이에 첫 번째 작업의 상태가 resque-status에 의해보고됩니다. 이것이 새 예외를 다시 제기하는 이유입니다. 그렇지 않으면 새 작업자가 이전 작업을 선택하기 전까지 작업 상태가 완료된 것으로 표시되어 작업을보고 기다리고 작업을 마칠 때까지 혼란 스러울 수 있습니다.

새로운 예외 DeferredToNewJob을 발생 시키면 작업 상태가 일시적으로 표시되어 프런트 엔드에서 작업하기가 쉬워지고 특정 예외가 자동으로 대기열에서 지워질 수 있습니다.

UPDATE

resque-상태 on_failure 핸들러에 대한 지원을 제공합니다. 이 이름을 가진 메소드가 클래스에서 인스턴스 메서드로 정의되어있는 경우, 우리는

이 더 간단이 다음 장소에 내 ON_FAILURE

def on_failure(e) 
    if e.is_a? DeferredToNewJob 
    tick('Waiting for new job') 
    else 
    raise e 
    end 
end 

의 만들 수있는 작업은 실패 상태에 기본적으로 시간을 소비하지 프로세스가 상태를보고 있는지 확인합니다. 또한 resque-status가이 핸들러를 찾으면 resque까지 예외를 발생시키지 않으므로 실패한 대기열에 추가되지 않습니다.