0

私の調査モデルには約 2500 のインスタンスがあり、set_state各インスタンスにメソッドを 2 回適用する必要があります。すべてのインスタンスにメソッドが 1 回適用された後でのみ、2 回目に適用する必要があります。(インスタンスの状態は、他のインスタンスの状態に依存する場合があります。)

delayed_job遅延ジョブを作成worklessし、必要に応じてワーカー dyno を自動的にスケールアップ/ダウンするために使用しています。

通常、set_stateメソッドの実行には約 1 秒かかります。そこで、heroku コンソールで以下を実行しました。

2.times do
  Survey.all.each do |survey|
    survey.delay.set_state
    sleep(4)
  end
end

API をオーバーロードしても問題はないはずですよね?

それでも、遅延した各ジョブのログに次のように表示されます。

Heroku::API::Errors::ErrorWithResponse: Expected(200) <=> Actual(429 Unknown)

無限ループは見られません。遅延ジョブを作成するとすぐにこのメッセージが返されます。

Heroku の API レート制限を超えないようにするにはどうすればよいですか?

4

1 に答える 1

2

worklessを確認すると、遅延したジョブごとにワーカー数をチェックする API 呼び出しが発生し、スケールアップ/ダウンするために 2 回目の API 呼び出しが発生する可能性があるようです。したがって、短期間に 5000 (2500x2) のジョブを実行すると、5000 以上の API 呼び出しが発生することになります。これは、1 時間あたり 1200/リクエストの制限をはるかに超えています。API の全体的な使用量を減らすために役立つことを願って、あそこにコメントしましたが ( https://github.com/lostboy/workless/issues/33#issuecomment-20982433 )、より具体的な解決策を提供できると思います。

それまでの間、特にワークロードがかなり予測可能な場合 (このように)。仕事のない時間をスキップして、その部分を自分で行うことをお勧めします。つまり、いつスケーリングを行う必要があるかを既に知っているようです (上記のループの直前にスケールアップし、直後にスケールダウンします)。その場合、workless での動作をエミュレートするために次のようなことを行うことができます。

require 'heroku-api'
heroku = Heroku::API.new(:api_key => ENV['HEROKU_API_KEY'])

client.post_ps_scale(ENV['APP_NAME'], 'worker', Survey.count)
2.times do
  Survey.all.each do |survey|
    survey.delay.set_state
    sleep(4)
  end
end
min_workers = ENV['WORKLESS_MIN_WORKERS'].present? ? ENV['WORKLESS_MIN_WORKERS'].to_i : 0
client.post_ps_scale(ENV['APP_NAME'], 'worker', min_workers)

これらの仕事からも無職を削除する必要があることに注意してください。ただし、特定のジョブに対してのみこれを行う特定の方法は見当たりませんでした。そのため、必要な場合はそのプロジェクトについて質問することをお勧めします。また、これが 2 パスである必要がある場合 (1 回目は 2 回目の前に終了する必要があります)、場合によっては 4 秒のスリープでは不十分かもしれませんが、それはワームの別の缶詰です。

I hope that helps narrow in on what you needed, but I'm certainly happy to discuss further and/or elaborate on the above as needed. Thanks!

于 2013-07-15T16:50:51.387 に答える