【Rails】deliver_later と deliver_now の違いと使い分け

サムネイル Ruby

Railsで開発中に「deliver_laterとdeliver_nowの違いってなんだ?」と今更疑問に思ったので、調べてみました。

結論

deliver_later

メール送信を非同期処理で行なっているため、コントローラーとしての処理は速くなるが、ジョブが中断されるようなことがあるとメールが届かない場合がある

開発環境向き(Active Jobアダプタで対策可能)

deliver_now

確実にメールを届けることができるが、同期処理のため規模の大きいメール送信処理には不向き

そのため、多少パフォーマンスが悪くても良い処理(そんなのあるのか?)には使えそうですね

解説

deliver_later

まず、deliver_laterを理解するにはActiveJobを理解しておく必要があるため、知らないよーという方は下記の記事を一読することをオススメします。

Ruby on RailsのActiveJobとは?


deliver_laterは、ActiveJobを使って処理の順番が回ってきたタイミングでdeliver_nowを呼び出してメールを送信します。

そのため、コントローラは送信完了を待たずに処理を続行できるので、処理速度が向上します。

ただ問題点があり、Jobの処理順番を待っているタイミングでプロセスが切れたりするとジョブは全て失われてしまい、メール送信処理も行われなくなってしまいます

その対策はとして、SidekiqやResqueなどのActive Jobアダプタを使って永続的なバックエンドを実現できるそうです。

まとめると、デフォルトの機能では、本番環境での不具合となる危険性を孕んでいますが、開発環境では特にリスクなく処理速度を向上させてくれる送信方法ということですね。

deliver_now

同期処理でメール送信を行います

そのため、大量にメールを送信する場合には処理時間がかなりの長さになってしまうため、不向きです。

逆に言えば、単発のメール送信処理などには向いているとも言えそうですね。

あとがき

調べてみると、今まで知らなかったのが恥ずかしいと思うくらい割と大事なことでした。

こういった知識の不足でシステムの不具合につながりそうなので、疑問に感じたことはすぐ調べないとですね、、、

参考記事

タイトルとURLをコピーしました