2011-12-06 6 views
2

Ruby on Rails 및 resque과 간단한 스택이 있습니다. 저는 정상적인 방법으로 일자리를 창출하고 있습니다. 아무것도 미치지 않는다.때때로 Resque가 명백한 이유없이 Rails 환경을 "언로드"합니다.

내 문제는 내가 오래 동안 작업자를 실행 상태로두면 앱의 모델에 대한 가시성이 멈추고 그러한 메서드를 호출 할 때마다 undefined_method이 발생한다는 것입니다.

이것은 매우 이상합니다. 일 동안 완벽하게 작동 할 수 있었고 갑자기 실패했을 경우이 시작됩니다. 작업자를 다시 시작하면 문제가 해결되지만 일반적으로 잠시 후에 다시 돌아옵니다.

나는 어떤 일이 벌어 질지 전혀 모른다. 그래서 어떤 포인터도 크게 감사 할 것이다.

+0

당신이 그 시간에 약간의 출시거야? 카스트 스트라노는 리스크가 작동하고있는 파일을 제거하고 있습니까? – phoet

+0

@phoet 개발 중에 있습니다. 아직 프로덕션 환경이 없습니다. 파일을 변경할 수는 있지만 작업자가 파일을로드하면 문제가 발생합니다. – marcgg

+0

오류 발생시 스택 추적을 게시 할 수 있습니까? 당신의 직원들이 애플리케이션 코드가 AWOL이 아닌 데이터베이스에 대한 연결을 잃어 버린 것 같아서. 하지만 레일스/액티브 코드 사용자가 아니므로 확실치 않습니다. –

답변

2

Resque 직원은 새로운 작업을 포크로 작업합니다. 모델의 클래스가 분기 된 하위 프로세스에로드되지 않았을 수 있습니다. 클래스가로드되는 순서 때문에 네임 스페이스 충돌이 발생할 수도 있습니다.

resque worker를 다시 시작하지 않고 개발중인 클래스 파일을 변경하는 중이면 클래스를 올바르게 다시로드하지 않는 것 같습니다.

클래스가 사전 포크로로드되도록하려면 resque 설치 작업에서 클래스를 참조하십시오. 사전로드 된 클래스는 하위 프로세스에 복사됩니다. 아래에, 나는 그들이 그들을로드 강제로 배열에 넣어. 또한 각 하위 프로세스에 이미 클래스가로드되어 있기 때문에 더 빠릅니다. 또한 AR을 사용하는 경우 after_fork 블록에서 ActiveRecord 연결을 다시 설정해야합니다.

lib 디렉토리/작업/resque.rake :

namespace :resque do 
    task :setup => :environment do 
    [User, Monkey, Banana] # force these classes to load 

    Resque.after_fork { ActiveRecord::Base.establish_connection } 
    end 
end 
+0

이것은 정확하게 일어난 일입니다. 감사합니다. – marcgg

+0

왜 after_fork에서 AR 연결을 재설정해야합니까? –