Rails で作成した API サーバーで
レスポンスはすぐに返しつつ
やや重い処理(数秒程度)でDBにデータを作成する処理を非同期で起動したいです
Rails には rake tasks という機構がはじめからそなわっているので
rake:task をcontrolloerから叩く場合の引数の渡し方
を参考にして
namespace :hoge do task :hello do |t, args| sleep 10 puts "Hello, #{args['id']}" end end
というわざと10秒かかるタスクを作成し、
コントローラーから以下のように呼び出してみたのですが
def index Rails.application.load_tasks Rake::Task['hoge:hello'].execute(id: 1001) end
非同期にならずページのレンダリングが10秒後になります
rake task は非同期処理に使えるものではないのでしょうか?
ActiveJob を使う方法も一般的みたいなのですが
バックエンドにどれを選択してもそれなりに大掛かりなミドルウェアが必要みたいで
サーバーへの影響やデーモンの監視等が必要になってくるので
手軽に非同期処理を実現する方法を探していたのですが
やはり ActiveJob を使う以外に方法はないのでしょうか
(以前 sidekiq を1度使ったことがあるのですが capistorano に対する理解があまり深くないのでバックエンドでデーモンを動かす設定等が大変で何日もはまったのであまりやりたくない)
環境が AWS なので Lambda にして Event モードで呼び出すのもありかなと思っているのですが、API から起動される非同期な Lambda から MySQL へアクセスするのは(コネクションを都度都度張ってしまうため)アンチパターンみたいで、サービスを利用する人が増えてくるとスケーラビリティに問題がありそうです
こういうケースでなにか簡単にできるいい方法があれば教えていただきたいです
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/13 19:15