メソッドの遅延実行とは何か。
つまるところ、同期的な処理を非同期に処理をしたい。
.delayed
でメソッドの実行を遅延する
パッと探した感じ見当たらなかったので、gemを入れるだけで簡単に導入できるようにした。
activejob-delayed_executionを入れるだけで、メソッドを非同期に実行することができる。
gem 'activejob-delayed_execution'
# Railsなら config/initializers/activejob_delayed_execution.rb
# Define .delayed method
ActiveRecord::Base.include(ActiveJob::DelayedExecution)
item = Item.first
item.generate_manuscript # めっちゃ重い処理。ブロッキングする
item.delayed.generate_manuscript # ( ゚∀゚)o彡゚非同期に実行される
ActiveJobに乗っているため、SidekiqのDelayed extensionと比べてredis等のメモリ消費が少なくてエコである。(3~10倍ほど変わる)
思いついて1時間ほどでProductionへ導入したのだけれど、今のところ元気に動いている。
ActiveJob便利。
お仕事ではpixivFACTORYというサービスで、ユーザーさんにグッズづくりを楽しんでもらっています。
このサービスでは印刷用のデータを生成するために、複雑で重い処理をしている。
# だいたいこんなイメージ
class Item < ActiveRecord::Base
def generate_manuscript
# 画像などを生成するめっちゃ重い処理
end
end
こういった処理を書くのにActiveJob
を使うのだろうけれど、メソッドを呼び出すだけの処理をわざわざJobを定義するのは冗長だ。
こういった仕組みで簡単に遅延処理ができるようになったのは嬉しい。