はじめに
実務でバッチ処理を実装することがあるかと思いますが、右も左も分からず悔しかったので学習したものを備忘録としてまとめようと思います!自分と同じくまだ理解してない人はぜひ参考にしてください!
バッチ処理とは
バッチ処理とは、アプリケーションに関するデータの参照と更新をソースコードに書かれた仕様に従って実現します。
大量のデータを更新する処理や時間を必要とする処理も取り扱うことができます。
例:情報の一括更新、バックアップの作成...etc
バッチ処理実装方法
自分の調べた感じで言うと、主に2つの実装方法があるらしいので、どちらがよく使われてることもないと思うので、どちらも紹介したいと思います!
Rails Taskを用いた実装
1.lib/tasks
配下にrakeファイルを作成します。
※あるまとまりごとにディレクトリを作成することが多いようです
$ touch lib/tasks/samples/sample1.rake
2.作成したrakeファイルに処理を実装していく。
namespace :samples do
desc 'サンプルバッチ処理1'
# config/environment.rbを読み込み、環境ごとの設定を反映してからsample1を実行
task sample1: :environment do
# 具体的な処理を実装
end
end
3.タスクが登録されているか確認する。
$ rails -vT
#=> rails samples:sample1がある
4.バッチ処理を実行する。
$ rails samples:sample1
wheneverを用いた実装
1.wheneverを導入し、bundle install
を実行する。
gem 'whenever', require: false
2.config/application.rb
に以下を追記する。
class Application < Rails::Application
...
# /libファイル以下を自動でロード
config.autoload_paths += Dir["#{config.root}/lib"]
...
end
3.lib/batch
配下にバッチ処理を記載するファイルを作成する。
class Batch::Sample
def self.run
puts 'サンプルバッチ処理実行!'
end
end
4.処理が問題無く実行できるか動作確認をする。
$ bundle exec rails r Batch::Sample.run
#=> "サンプルバッチ処理実行!"
5.自動で実行するスケジュールを作成するために以下のコマンドでファイルを作成する。
$ bundle exec wheneverize .
#=> config/schedule.rbが作成される
6.config/schedule.rb
を以下のように修正する。
# Rails.rootを使用するために必要
require File.expand_path(File.dirname(__FILE__) + "/environment")
# cronを実行する環境変数
rails_env = ENV['RAILS_ENV'] || :development
# cronを実行する環境変数をセット
set :environment, rails_env
# cronのログの吐き出し場所
set :output, "#{Rails.root}/log/cron.log"
# 毎日午前0時に実行
every 1.day, at: '0:00 am' do
runner "Batch::Sample.run"
end
7.cronへ設定を反映させる。
# cronへ反映する
$ bundle exec whenever --update-crontab
8.しっかり反映されているか確認する。
$ crontab -l
cronとは?
cronとは、Linuxサーバー管理の設定方法の一つです。「何を」「いつ(頻度)」実行するかを決め、そのルールを書き込みます
。指定したプログラムの動作を予約したり、実行する頻度を細かく調整できるので、自動的に繰り返すことができる。
終わりに
実装方法はどちらでも良い
ので、使いやすい方でいいかと思います。バッチ処理を理解していると強強エンジニアのイメージが個人的にはあるので、スキルを身につけて行きましょう!笑
参考
[Ruby on Rails でバッチ処理を実装する]
(https://hiromiick.com/rails-batch-whenever/)
[Railsでバッチ処理してみる]
(https://ccbaxy.xyz/blog/2019/11/30/ruby17/)
[【Rails】whenever によるバッチ処理(runner編)]
(https://qiita.com/syukan3/items/eef3f8929ecb5d6ef6ff)
[Wheneverは導入が超簡単なcrontab管理ライブラリGemです!]
(https://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/index.html)