2016-10-30 4 views
1

나는 Heroku를 사용하고 싶지만 무작위로 24 시간마다 dynos를 다시 시작한다는 사실 때문에 상황이 다소 어려워집니다.Heroku에서 장기 실행 작업을 어떻게 처리합니까?

저는 지불 처리를 다루는 일련의 직무를 매우 중요하게 생각하며 데이터베이스를 통해 100 % 신뢰할 수 있도록 지원하고 싶습니다. 이런 이유로 나는 느린 DJ를 선택했다.

나는 DJ를 선택했기 때문에 한 번에 데이터베이스에 5,000,000 개의 이벤트를 보낼 수 없다는 것을 의미합니다 (전자 메일을 보낼 때마다 1 개).

그 때문에, 나는 더 오래 실행되는 작업 (몇 시간에 걸쳐 200,000 개의 텍스트 메시지 보내기)이 있습니다.

중간에 실행이 길어지면 중간에 오른쪽으로 잘리는 것이 효과적입니다.

heroku가 SIGTERM을 전송 한 다음 30 초 이내에 프로세스가 종료 될 것으로 예상됩니다. 이것은 나의 더 긴 일을 위해 일어나지 않을 것입니다.

이제 처리 방법을 잘 모르겠습니다 ... 내가 생각할 수있는 유일한 방법은 예를 들어 텍스트 (예 : sms_sent_at 열)를 보낸 후 데이터베이스를 업데이트하는 것입니다. 모든 배치에 대해 단일 업데이트 쿼리를 보내는 대신 데이터베이스 성능을 파괴합니다.

재시작을 예약 할 수 있다면 훨씬 더 좋을 것입니다. 적어도 밤에는 30 초 이상 걸리지 않는 작업을 99 % 실행하지 않을 가능성이 있습니다. 하위.

다른 방법으로, 장시간 실행중인 DJ 내에서 SIGTERM을 듣고 적어도 일찍 루프를 중단하여 나중에 다시 시작할 수 있습니까?

답변

0

Dynos and the Dyno Manager 여기에 적절한 대답, 당신은 (내가 여기 DJ을 사용하고 있습니다) 다음 정상적으로 구출 SIGTERM을 수신. 직업이 멱등수가되는 것이 중요합니다. 여기

Long running delayed_job jobs stay locked after a restart on Heroku

class WithdrawPaymentsJob 

    def perform 
    begin 
     term_now = false 
     old_term_handler = trap('TERM') { term_now = true; old_term_handler.call } 

     loop do 

     puts 'doing long running job' 
     sleep 1 

     if term_now 
      raise 'Gracefully terminating job early...' 
     end 
     end 

    ensure 
     trap('TERM', old_term_handler) 
    end 
    end 

end 

Que와 그것을 해결 방법은 다음과 같습니다

if Que.worker_count.zero? 
     raise 'Gracefully terminating job early...' 
    end 
1

수동으로 다시 시작하면 24 시간 시계가 재설정됩니다. heroku ps:restart은 원하는 시간에 원하는 컨트롤을 제공해야합니다.

더 많은 정보는 여기에서 찾을 수 있습니다 :

관련 문제