Mam aplikację rails, w której mam funkcję, która wysyła kilka e-maili. Chciałbym to zrobić asynchronously
i myślałem, że metoda deliver_later
to zrobi. Obecnie mam pewne opóźnienie, od kiedy użytkownik klika submit
, dopóki formularz nie zostanie przesłany - co prowadzi do złego doświadczenia użytkownika (jest to dość prosta forma). Moja implementacja wygląda następująco:Rails 4 - Mailer nie działa tak, jak się spodziewam, blokuje UI
def create
respond_to do |format|
if @competition.save
[...]
send_notification_to_team_members
end
end
def send_notification_to_team_members
@team.members.each do |member|
unless member.user.eql?(current_user)
Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later
end
end
end
Obecnie trwa około 4 sekundy, aby akcja została zakończona. Próbowałem również:
Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later(wait: 1.minute)
Następnie trwa jeszcze dłużej - Chciałbym oszacować ~ 1 minutę.
Czy używam błędnie deliver_later
, czy też metoda nie działa zgodnie z oczekiwaniami. W takim razie, czy istnieje inna metoda, którą mogę wykorzystać, aby poprawić swoją wydajność?
Z jakiego zaplecza aktywnie pracuję? –
Asynchronicznie powinieneś wysyłać wiadomości e-mail, jeśli korzystasz z 4.2, możesz użyć ActiveJob, lub jeśli nie, powinieneś użyć takich rozwiązań jak Sidekiq lub Rescue –
FYI: [Tutaj] (https: //blog.engineyard.com/2014/getting-started-with-active-job) jest dobrym artykułem o używaniu ActiveJob do wysyłania wiadomości e-mail –