3

Rails アプリでsidekiqを使用して、ユーザーがある特定のページから別のページに移動したときに、 SQL Serverデータベースでストアド プロシージャを非同期的に実行しています。

問題は、ストアド プロシージャが完了するまでに最大 4 分かかり、sidekiqがタイムアウト メッセージを返す (そして再試行する) ことです。

database.yml でアプリケーションのグローバル データベース タイムアウト設定を変更したくありません(解決するかどうかさえわかりませんが、それを行うことはできません)。

メソッドに時間がかかる可能性があることをsidekiqに伝えてから、タイムアウトエラーが発生しないようにする方法はありますか?

どんな助けでも本当に感謝しています。

更新 #1

2013-06-03T17:14:18Z 6136 TID-1ac4ik GeneratePropertyProfile JID-de571df94f21b9159c74db6b 情報: 開始

2013-06-03T17:19:03Z 6136 TID-1ac4ik GeneratePropertyProfile JID-de571df94f21b9159c74db6b 情報: 失敗: 285.218 秒

2013-06-03T17:19:03Z 6136 TID-1ac4ik 警告: {"再試行"=>true、"queue"=>"default"、"class"=>"GeneratePropertyProfile"、"args"=>[{"id "=>41915658}], "jid"=>"de571df94f21b9159c74db6b", "error_message"=>"TinyTds::Error: Adaptive Server 接続がタイムアウトしました: EXEC gaiainc.sp_wait", "error_class"=>"ActiveRecord::StatementInvalid" 、「failed_at」=>2013-06-03 17:19:03 UTC、「retry_count」=>0}

2013-06-03T17:19:03Z 6136 TID-1ac4ik 警告: TinyTds::Error: Adaptive Server 接続がタイムアウトしました: EXEC gaiainc.sp_wait

更新 #2

database.ymlを変更せずに動作するようになりました。ただし、initializers/sidekiq.rb に次のコードを追加する必要がありました。

Sidekiq.configure_server do |config|
  ActiveRecord::Base.connection.disconnect!
  ActiveRecord::Base.configurations[Rails.env]['timeout'] = 300000
  ActiveRecord::Base.establish_connection
end

私はそれが醜い解決策であることを知っていますが、それを機能させるための別の解決策を見つける時間がありませんでした. 誰かがよりクリーンな解決策を持っている場合は、このトピックに返信してください。

ありがとうございました!

4

1 に答える 1

5

TERM は、Sidekiq が -t タイムアウト オプション内でシャットダウンする必要があることを通知します。タイムアウト内に終了しないワーカーは強制的に終了され、メッセージは失われます。タイムアウトのデフォルトは 8 秒です

Sidekiq TERM タイムアウトは config/sidekiq.yml または -t パラメータで設定されます。Sidekiq は、TERM を受信すると、このタイムアウトまでに終了するために最善を尽くします。

:timeout: 300
于 2013-06-03T13:23:23.497 に答える