RailsアプリケーションでMySQLのMAX_EXECUTION_TIMEを適用する
MAX_EXECUTION_TIMEを設定できるレイヤーは、 「DBのシステム変数」 「モデルごとに適用する( https://github.com/rails/rails/pull/35615 )」「プロセスごとに適用する」がある。
「DBのシステム変数」 に関しては、システム共通の値となるため使いにくい。「モデルごとに適用する」に関しては、使われ方によっては有用だけど、どのアプリでも使えるわけではないと思う。本テキストでは、最後の 「プロセスごとに適用する」について説明する。
Railsアプリにおいては、「非同期ジョブプロセス」と「WEBプロセス」で、MAX_EXECUTION_TIME
を分けたいはず。例えば、バッチ処理はオンライン処理と比べて、MAX_EXECUTION_TIMEは長くなるだろう。
そういう時は config/database.yml
を次のように記述し、環境変数 MYSQL_MAX_EXECUTION_TIME
を設定してプロセスを起動すればいい。
production:
adapter: mysql2
[...]
variables:
max_execution_time: <%= ENV.fetch('MYSQL_MAX_EXECUTION_TIME', 100_000) %> # ms
$ MYSQL_MAX_EXECUTION_TIME=30000 bin/rails s
$ MYSQL_MAX_EXECUTION_TIME=90000 bin/sidekiq
テストコードは次のようなものを書けばよさそう。
expect(ActiveRecord::Base.connection.execute("SHOW VARIABLES LIKE 'max_execution_time'").to_a).to eq([["max_execution_time", "100000"]])
以上。
-
category:
- rails tags: