2013-02-25 2 views
9

다시 시작하거나 배포하면 실패한 대기열에 Resque::TermException (SIGTERM) 또는 Resque::DirtyExit과 같은 많은 Resque 작업이 생성됩니다. 우리는 또한 내가 힘의이 두 가지 예외에 자동 재 시도 생각하는 resque-retry을 사용하고Heroku : TermException 또는 SIGTERM from Heroku에서 정상적으로 복구

worker: TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake environment resque:work QUEUE=critical,high,low 

:처럼 우리는 우리의 Procfile의 새로운 TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10을 사용하고

그래서 우리의 노동자 라인이 보인다? 하지만 그렇지 않은 것 같습니다.

  1. 우리는 수동으로 각 작업에 Resque::TermException에서 구출하고, 작업을 다시 예약하려면이 옵션을 사용할 수 있습니다

    그래서 나는 두 가지 질문을 것 같아요. 그러나 모든 작업에 대해이를 수행 할 수있는 깨끗한 방법이 있습니까? 심지어 원숭이 패치.

  2. 자동 다시 시도 하시겠습니까? 왜 그렇게되지 않을지 생각할 수 있습니까?

고마워요!

편집 : 모든 작업을 10 초 이내에 완료하는 것이 비례 적으로 보입니다. Resque :: DirtyExit 예외가 실행될 때 이러한 작업을 자동으로 대기열에 두는 방법이 필요합니다.

답변

1

resque 작업을 완료하는 데 10 초 이상 소요됩니까? 초기 SIGTERM이 전송 된 후 10 초 이내에 작업이 완료되면 정상이어야합니다. 작업을 더 빨리 끝내는 작은 덩어리로 나누십시오. 또한

, 당신은 작업자 다시 대기열이 같은 일을 작업 할 수 있습니다 : 각 작업에서 우리는 수동으로 Resque에서 구할 수 https://gist.github.com/mrrooijen/3719427

+0

Upvoted 및 접수 - 우리가 비록 10 초 이상 그들 모두를 얻을 수 있다면 솔직히 모르겠어요. 우리는 하나의 파일을 생성해야하는 커다란 수출품 등을 가지고 있습니다. Re-enqueueing이 문제를 해결하는 것처럼 보입니까? 'Resque :: TermException'과'Resque :: DirtyExit' 사이의 차이점을 공유 할 수 있습니까? 나는 Resque :: DirtyExit을 위해 거기에 구조를 가지고있다. 그러나 그것은 항상 re-enqueue하는 것처럼 보이지 않는다. 감사! –

+0

업데이트로, 그들은 이상하게도 작업에서'Resqueue Resque :: DirtyExit'을 가지고 있음에도 불구하고 때로는 예외를 깨끗하게 구출하지 않습니다. 나는 이유를 알아낼 수 없었다. 이것은 Resque :: DirtyExit 예외가있는 실패한 대기열에서 여전히 작업을 찾을 수 있기 때문에 작업을 신뢰할 수 없게 만듭니다. 정말 문제가되고있다. –

+0

누군가가 작업자 내부에서 SIGTERM을 처리하여 작업자가 깨끗하게 셧다운 할 수있는 방법을 제안 할 수 있습니까? 예를 들어 (resque) 작업자도 SIGTERM을 잡아서 루핑 코드가 주기적으로 검사하는 변수를 설정해야합니까? TermException 또는 DirtyException이 RESQUE_TERM_TIMEOUT secnds 후에 만 ​​전달된다고 가정합니다. –

1
  1. :: TermException을하고 작업을 다시 예약이 사용 . 그러나 모든 작업에 대해 이것을 수행 할 수있는 깔끔한 방법이 입니까? 심지어 원숭이 패치.

작업이 SIGTERM 신호와 사망 때 Resque::DirtyExit 예외가 발생합니다. 그 직업은 당신이 read here처럼 예외를 잡을 기회가 없습니다.

  1. 자동 다시 시도하지 않아야합니까? 왜 그렇게되지 않을지 생각할 수 있습니까?

스케쥴러가 실행되는 이유는 모르겠습니까? 아니라면 rake resque:scheduler.

은 내가 Resque::DirtyExit와 최근에했던 문제들을 중심으로 상세한 블로그 포스트를 작성, 어쩌면 = 유용합니다> Understanding the Resque internals – Resque::DirtyExit unveiled 나는 또한 신뢰할 수있는 솔루션을 찾지 못하고 잠시이 고생 한

0

.

내가 찾은 몇 가지 해결책 중 하나는 Resque :: DirtyExit로 실패한 작업을 찾는 일정 (cron 작업을 1 분마다 수행)으로 작업을 실행하고 이러한 특정 작업을 재 시도하고 실패로부터 이러한 작업을 제거하는 것입니다 열.

여기에이 솔루션은 최적 분명히 레이크 작업 https://gist.github.com/CharlesP/1818418754aec03403b3

의 샘플입니다하지만 지금까지 내가이 작업을 다시 시도 할 찾은 최고의 솔루션입니다.

2

이 문제도 발생했습니다. Heroku는 SIGTERM 신호를 상위 프로세스뿐만 아니라 모든 포크 된 프로세스에도 전송합니다. Resque가 예상하는 논리가 아니기 때문에 RESQUE_PRE_SHUTDOWN_TIMEOUT이 건너 뛰게되어 작업을 완료 할 시간이 없어도 강제로 작업이 실행됩니다.

Heroku는 SIGTERM이 발급 된 후 30 초를 정상적으로 종료합니다. 대부분의 경우, 작업을 마칠 수없는 경우 Resque로 작업을 다시 대기시키기 위해 약간의 버퍼 시간을두고 작업을 완료 할 충분한 시간입니다. 그러나이 모든 시간을 사용하려면 RESQUE_PRE_SHUTDOWN_TIMEOUTRESQUE_TERM_TIMEOUT 환경 변수를 설정하고 Resque 패치를 SIGTERM에 올바르게 응답하도록 설정해야합니다.

여기 resque 패치보다 구체적으로이 문제를 설명하는 보석이다 :

https://github.com/iloveitaly/resque-heroku-signals

+0

올바른 설명입니다. 감사합니다 @iloveitaly – Yoni