Dobre pytanie Do tego zadania rzeczywiście nie musisz podpinać Sidekiqa.
Różnica w podejściu może być jednak znaczna.
1 - Cron) Lecisz po wszystkich wypożyczeniach, sprawdzasz termin i albo wysyłasz maila inline, albo go kolejkujesz (np. przez deliver_later
). Pierwsze podejście niesie za sobą kilka problemów, głównie z obsługą błędów - jeśli wystąpi jakiś błąd z wysyłką musisz wiedzieć jakie maile zostały wysłane, żeby przy ponowieniu nie wysłać ich podwójnie. Drugie podejście jest bardziej bezpieczne, gdyż każda wysyła jest “izolowana” i odporna na błędy innych.
Przykład pseudokodu:
BookBorrowing.with_due_date_soon.each do |borrowing|
ReminderMailer.deliver_later(borrowing)
end
lub
BookBorrowing.all.each do |borrowing|
ReminderMailer.deliver_later(borrowing) if borrowing.due_date_soon?
end
Czasem logiki wyciągnięcia odpowiednich danych nie da się załatwić zapytaniem SQL, lub z jakiegoś powodu nie chce się tego robić (drugi przykład). I tu wchodzi Sidekiq, gdyż możesz dodać do niego więcej logiki.
2 - Cron + Sidekiq)
Lecisz Cronem po wszystkich wypożyczeniach i dla każdego wypożyczenia kolejkujesz joba, który nie tylko odpowiada za wysyłkę maila, ale również za sprawdzenie, czy mail powinien zostać wysłany. Tu już masz większe pole do popisu, można ugrać o wiele “bezpieczniejszy”, odporniejszy na błędy kod. Za darmo dostajesz też pogląd obecnej sytuacji przez UI (sidekiq ma to wbudowane) i możliwość ponowienia joba który się nie wykonał prawidłowo (np. dla jednego rekordu wystąpił błąd sprawdzania terminu).
Przykład pseudokodu:
Cron:
BookBorrowing.all.each do |borrowing|
ReminderJob.perform_async(borrowing.id)
end
Sidekiq:
class ReminderJob
def perform(borrowing_id)
# find borrowing...
if borrowing.due_date_soon?
send_email
else
do_nothing
end
end
end
Jest to tylko liźnięcie tematu ale mam nadzieję że dało Ci lepszy pogląd na sytuacje . Pomyśl jak najlepiej połączyć narzędzia aby ugrać kod bardziej odporny na błędy, a jeśli już wystąpią, to abyś wiedział co się sypnęło i mógł to łatwo poprawić . W produkcyjnych aplikacjach zwróć uwagę na skalowalność, w ostatnim przykładzie każde wypożyczenie dokłada kolejne zadanie, cały proces może spuchnąć jeśli będzie dużo wypożyczeń.