2016-10-30 13 views
1

私はHerokuを使いたいですが、ランダムな時間に24時間ごとにdynosを再起動するという事実は、少し難しいものになっています。Herokuで長時間実行されているジョブを処理するにはどうすればよいですか?

私は非常に重要な支払い処理を扱う一連の仕事を持っています。彼らは100%信頼できるようにデータベースによって支援されています。このため、私は遅いDJを選んだ。

私はDJを選んだので、一度にデータベースに5,000,000件のイベントを送信することはできません(1回のメール送信ごとに1回)。

そのため、私は長時間実行しているジョブがあります(数時間かけて200,000のテキストメッセージを送信します)。

これらの実行時間の長いジョブでは、途中で途切れてしまった場合には、それらを稼働させるのが難しくなります。

herokuがSIGTERMを送信してから30秒以内にプロセスがシャットダウンするように見えます。これは私の長い仕事のために起こることはありません。

これを処理する方法がわかりません...私が考えることができる唯一の方法は、テキスト(たとえば、sms_sent_at列)を送信した直後にデータベースを更新することですが、すべてのバッチに対して単一の更新クエリを送信するのではなく、データベースのパフォーマンスを破壊します。

これは、再起動をスケジュールできれば、少なくとも私が99%の確率でシャットダウンするのに30秒以上かかるジョブを実行していない可能性があるダウン。

他の方法では、長時間走っている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は、あなたが探しているコントロールを与えるべきです。

詳細情報はここで見つけることができます:

関連する問題